TL; DR
以前DSTが9月の最後の日曜日に終了した1980年と2016年
間で変更Daylight Saving Time (DST)の定義は、後で10月の最後の日曜日に終了するように変更。
詳細な回答
パズルの欠けている部分は、あなたの計算に使用される特定の時間帯を知ることです。 あなたの質問とサンプルコードは、使用されたタイムゾーンを正確に教えてくれません。ここでは、DSTの定義が変更されているため、Europe/Berlin
(ドイツ語ではっきりとローカライズされたテキストの使用に基づく)と同様のタイムゾーンを使用しているものとします。
CET
とCEST
は、実際にタイムゾーンではありません。そのような略語は標準化されておらず、独自のものでもありません。 避けてください。
代わりにtz databaseに定義されているようにproper time zone namesを使用してください。 A true time zoneは、offset-from-UTCと、夏時間(DST)などの過去、現在、および将来の異常を処理するための一連のルールを加えたものです。
タイムゾーンのルールが変更され、驚くほど頻繁に変更されます。退屈な政治家、私は思います。
たとえば、Europe/Berlin
は、1980年に9月の最後の日曜日にDSTを終了するように変更されました。したがって、DSTは1980年10月のあなたの日付には当てはまりません。1996年以来、DSTを9月よりむしろ10月最後の日曜日に延長するEU規則が適用されます。したがって、DST はとなります。
質問内のコードは実際には月が「10」を意味する月「9」を使用します。古いjava.util.Date
クラスの多くの問題の1つは、ゼロベースのカウント、0 = 1月によって数えられることです。古い日時クラスを避けるための多くの理由の1つ。対照的に、Javaでは。10月の月の数値は実際には10であり、Month
の定数を使用するとさらに明確になります。
ちなみにjava.util.Date
のもう1つの貧弱なデザインの選択肢は、Question内のconstructing a Date
object as you didの場合、JVMの現在のデフォルトタイムゾーンが適用され、結果がUTCに戻されます。これは、コードを実行したときに使用中のタイムゾーンを報告しなかったため、さらに複雑になります。
ところで、JavaScriptはほぼすべての開発プラットフォームと同様に、日時制作のサポートが貧弱です。可能であれば、Javaとその組み込みのjava.timeフレームワークを使用してみてください。 Oracle Tutorialを参照してください。次のコード例では、動作中のjava.timeを見ることができます。 1980年10月10日、Europe/Berlin
は2016年になります。
ZoneId zoneId = ZoneId.of ("Europe/Berlin");;
ZonedDateTime zdt_1980 = ZonedDateTime.of (1980 , Month.OCTOBER.getValue() , 10 , 0 , 0 , 0 , 0 , zoneId);
long seconds_1980 = zdt_1980.toEpochSecond();
ZonedDateTime zdt_2016 = ZonedDateTime.of (2016 , Month.OCTOBER.getValue() , 10 , 0 , 0 , 0 , 0 , zoneId);
long seconds_2016 = zdt_2016.toEpochSecond();
コンソールにダンプします。あなたはオフセットから、UTCという結果に表示することができます
System.out.println ("zoneId: " + zoneId);
System.out.println ("zdt_1980: " + zdt_1980 + " | seconds_1980: " + seconds_1980);
System.out.println ("zdt_2016: " + zdt_2016 + " | seconds_2016: " + seconds_2016);
は現在、2時間進んUTC(+02:00
)のために、古い時代に先駆けUTC(+01:00
)の1時間から変更しました。違いはDSTの再定義のためです。
だから、これはあなたが1980年に「CET」を持っていますが、2016年のために得たCEST
で2016 S
で「CEST」「夏」を意味し、「サマータイム」はDSTを意味理由を説明します。今年の2016年の10月のほとんどは「サマータイム」(DST)です。 1980年10月はDST/"CEST"ででなくでした。
するzoneid:ヨーロッパ/ベルリン
zdt_1980:1980-10-10T00:00 + 01:00 [ヨーロッパ/ベルリン] |秒_1980:339980400
zdt_2016:2016-10-10T00:00 + 02:00 [ヨーロッパ/ベルリン] | seconds_2016:1476050400
23:00 CET == 00:00 CEST(冬と夏の時間の差)。 – assylias
慎重に質問を読んでください。なぜこのような状況でJavaがCESTの代わりにCETを使用するのだろうかと思います。 – chris1069603
Javaで使用する実際のコードを入力してください。 7つのパラメータを取る 'java.util.Date'のコンストラクタはありません。また、年と月のオフセットを差し引く必要があります。また、両方の環境で設定したタイムゾーンを表示してください。 –