JavaScriptのgetTimezoneOffset()
メソッドは、ブラウザーで、00:00タイムゾーンからオフセットされた分数を返します。たとえば、夏時間(DST)のAmerica / New_Yorkタイムゾーンは数値300を返します。300分は、ゼロから5時間の差です。300分を60分で割ると5時間になります。すべてのタイムゾーンは、ゼロタイムゾーン、+ 00:00/その他/GMT/グリニッジ標準時と比較されます。
MDN Web Docs
次に知っておく必要があるのは、オフセットの符号が実際のタイムゾーンと反対であるということです。
タイムゾーンに関する情報は、Internet Assigned Numbers Authority(iana)によって管理されています。
ianaタイムゾーン
タイムゾーンの適切にフォーマットされたテーブルは、joda.orgによって提供されます
joda-timeタイムゾーン
+00:00またはEtc/GMTはグリニッジ標準時です
すべてのタイムゾーンは+00:00 / "Etc /GMT"/グリニッジ標準時からオフセットされています
夏時間は、夏の「通常の」時間よりも常に早い時間です。あなたは秋の季節に時計を戻しました。(何をすべきかを覚えておくための「フォールバック」スローガン)
したがって、夏時間(冬)のAmerica / New_York時間は、通常の時間の1時間前です。したがって、たとえば、夏のニューヨーク市では通常午後5時でしたが、現在は夏時間のアメリカ/ニューヨーク時間の午後4時です。「America/New_York」時間という名前は、「LongFormat」タイムゾーン名です。米国の東海岸は通常、タイムゾーンを東部標準時(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
}