getTimezoneOffset()
ブラウザのJavaScript のメソッドは、00:00タイムゾーンからのオフセットの分数を返します。たとえば、夏時間(DST)のAmerica / New_Yorkタイムゾーンは数値300を返します。300分はゼロから5時間の差です。300分を60分で割ると5時間になります。すべてのタイムゾーンはゼロタイムゾーンと比較されます(+00:00 / Etc / GMT /グリニッジ標準時)。
MDN Webドキュメント
次に知っておく必要があるのは、オフセットには実際のタイムゾーンとは反対の符号があるということです。
タイムゾーンに関する情報は、Internet Assigned Numbers Authority(iana)によって管理されています
アナのタイムゾーン
タイムゾーンのきれいにフォーマットされた表はjoda.orgから提供されています
jodaタイムタイムゾーン
+00:00またはEtc / GMTはグリニッジ標準時です
すべてのタイムゾーンは+00:00 / "Etc / GMT" /グリニッジ標準時からオフセットされています
夏時間は常に夏の「通常の」時間より早い時間です。秋のシーズンに時計を戻します。(何をすべきかを思い出すための「フォールバック」スローガン)
したがって、夏時間(冬)のアメリカ/ニューヨーク時間は通常時間の1時間前になります。たとえば、通常、夏のニューヨーク市の午後5時だったものは、夏時間のアメリカ/ニューヨーク時間で午後4時になります。「America / New_York」という名前は、「Long Format」タイムゾーン名です。米国の東海岸は通常、タイムゾーンを東部標準時(EST)と呼んでいます。
今日のタイムゾーンオフセットを他の日付のタイムゾーンオフセットと比較する場合は、タイムゾーンオフセットの数学記号(+/- "正/負")がタイムゾーンの反対であることを知る必要があります。
joda.orgのタイムゾーンテーブルを見て、 "America / New_York"のタイムゾーンを見つけます。標準オフセットの前に負の符号があります。
地球はその軸を中心に反時計回りに回転します。グリニッジで日の出を見る人は、ニューヨーク市の誰かが日の出を見る5時間前に日の出を見ます。そして、米国の東海岸にいる誰かが日の出を見た後に、米国の西海岸にいる誰かが日の出を見るでしょう。
これをすべて知る必要があるのには理由があります。そのため、1年の異なる時間にすべてのタイムゾーンをテストする必要なく、一部のJavaScriptコードがDSTステータスを正しく取得しているかどうかを論理的に判断できるようになります。
ニューヨーク市が11月で、時計が1時間遅れているとします。ニューヨーク市の夏のオフセットは240分または4時間です。
これをテストするには、7月の日付を作成し、オフセットを取得します。
var July_Date = new Date(2017, 6, 1);
var july_Timezone_OffSet = July_Date.getTimezoneOffset();
console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)
ブラウザーの開発者ツールコンソールログには何が出力されますか?
正解は240です。
これで、1月に日付を作成し、冬季のタイムゾーンオフセットに対してブラウザーが返す結果を確認できます。
var Jan_Date = new Date(2017, 0, 1);//Month is zero indexed - Jan is zero
var jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();
console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)
答えは:300
明らかに300は240よりも大きいのです。つまり、これはどういう意味ですか?冬のオフセットが夏のオフセットよりも大きいかどうかをテストするコードを記述する必要がありますか?または夏のオフセットは冬のオフセットよりも少ないですか?夏時間帯と冬時間帯のオフセットに差がある場合は、この時間帯にDSTが使用されていると想定できます。しかし、それはあなたに伝えません今日がブラウザーのタイムゾーンにDSTを使用しはわかり。したがって、今日のタイムゾーンオフセットを取得する必要があります。
var today = new Date();
var todaysTimeZone = today.getTimezoneOffset();
console.log('todaysTimeZone : ' + todaysTimeZone)
答えは:?-時期によって異なります
今日のタイムゾーンオフセットと夏のタイムゾーンオフセットが同じ場合、 と夏と冬のタイムゾーンオフセットは異なっている、そして論理的控除で、今日はDSTにはないしなければなりません。
夏と冬のタイムゾーンオフセットの比較(このタイムゾーンにDSTが使用されているかどうかを知るため)を省略して、今日のタイムゾーンオフセットを夏のTZオフセットと比較するだけで、常に正しい答えを得ることができますか?
today's TZ Offset !== Summer TZ Offset
さて、今日は冬ですか、夏ですか?それを知っていれば、次のロジックを適用できます。
if ( it_is_winter && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
しかし問題は、今日の日付が冬か夏かが分からないことです。すべてのタイムゾーンには、DSTの開始と停止のタイミングに関する独自のルールを設定できます。世界のすべてのタイムゾーンについて、すべてのタイムゾーンのルールを追跡する必要があります。したがって、より良い簡単な方法がある場合は、より簡単な方法で行うこともできます。
残っているのは、このタイムゾーンがDSTを使用しているかどうかを確認し、今日のタイムゾーンオフセットと夏のタイムゾーンオフセットを比較する必要があるということです。それは常にあなたに信頼できる答えを与えるでしょう。
最終的なロジックは次のとおりです。
if ( DST_Is_Used_In_This_Time_Zone && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
ブラウザのタイムゾーンがDSTを使用しているかどうかを判別する関数:
function is_DST_Used_In_This_TimeZone() {
var Jan_Date, jan_Timezone_OffSet, July_Date, july_Timezone_OffSet
offsetsNotEqual, thisYear, today;
today = new Date();//Create a date object that is now
thisYear = today.getFullYear();//Get the year as a number
Jan_Date = new Date(thisYear, 0, 1);//Month is zero indexed - Jan is zero
jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();
console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)
July_Date = new Date(thisYear, 6, 1);
july_Timezone_OffSet = July_Date.getTimezoneOffset();
console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)
offsetsNotEqual = july_Timezone_OffSet !== jan_Timezone_OffSet;//True if not equal
console.log('offsetsNotEqual: ' + offsetsNotEqual);
return offsetsNotEqual;//If the offsets are not equal for summer and
//winter then the only possible reason is that DST is used for
//this time zone
}
getTimezoneOffset
は逆の値を返すため、Math.max
実際には標準のオフセットを返します。コードは正しいです。