2

( CodeReviewから移行)

私は実験を行い、Java Time をよりよく理解しようとしています。JSR-310 のタイム ゾーンの処理について、私の側で誤解が生じている可能性があります。

解析するタイムスタンプ文字列がありますDateTimeFormatter

String text = "2019-08-28T10:39:57+02:00";
DateTimeFormatter ISO_RFC_3339_PARSER = DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(ZoneId.of("Europe/Paris"));

上記の値は、サーバーの現地時間が中央ヨーロッパの午前 10 時 39 分であるときに生成されます。夏時間のため、UTC 時間は午前 8 時 39 分です。独自の計算を行って、自分のゾーンにいる時間を見つけることができます。

次のテストは、コンピューターのタイム ゾーンがタイムスタンプ (+2) に表示されているものと同じ場合に機能します。

@Test
public void testTimestamp()
{
    LocalDateTime time = ZonedDateTime.from(ISO_RFC_3339_PARSER.parse(text)).toLocalDateTime();

    errorCollector.checkThat(time.getYear(), is(2019));
    errorCollector.checkThat(time.getMonthValue(), is(8));
    errorCollector.checkThat(time.getDayOfMonth(), is(28));
    errorCollector.checkThat(time.getHour(), is(10));
    errorCollector.checkThat(time.getMinute(), is(39));
    errorCollector.checkThat(time.getSecond(), is(57));

}

Java Time がタイムゾーンを調整する方法をよりよく理解するために、入力文字列をいじってみまし。しかし、結果は驚くほど間違っています!

テストが失敗するように、入力文字列のタイムゾーンを繰り返し変更しようとしました。たとえば、文字列を次のように変更する2019-08-28T10:39:57+08:00と、パリの午前 2 時を意味します。しかし、上記のテスト コードは、時刻をチェックするときに引き続きパスします。つまり、結果LocalDateTimeの時刻はまだ午前 10 時です。

質問

ソース文字列のタイムゾーンを常に変更しているにもかかわらず、コードが現地時間として 10 を返すのはなぜですか?

LocalDateTime次に、RFC 3339 文字列 (埋め込まれたオフセットの瞬間を表す) を解析し、可能なゾーン調整に関してオブジェクトに変換する正しい方法は何ですか? マシンが CE[S]T タイム ゾーンで実行されているとします。

環境

タイムスタンプをコンピューターの時刻と比較して、古すぎないかどうかを確認する必要があります。つまり、米国の時間がヨーロッパで評価される場合、それは「古すぎる」可能性はありません。

4

2 に答える 2