web-dev-qa-db-ja.com

現在のタイムゾーンと東部タイムゾーンの時差に基づくLocalDateTimeの変更

1週間前に、LocalDateTimeとして2015-10-10T10:00:00を生成したとします。さらに、現在のタイムゾーンIDを生成したとしましょう

TimeZone timeZone = TimeZone.getDefault();
String zoneId = timeZone.getId();  // "America/Chicago"

そして、私のzoneIdは「America/Chicago」です。

LocalDateTimeをタイムゾーンID "America/New_York"のLocalDateTimeに変換する簡単な方法はありますか(つまり、更新されたLocalDateTimeは2015-10-10T11:00:00になります)?

さらに重要なのは、現在のタイムゾーンに関係なく、LocalDateTimeを東部時間(つまり、zoneId "America/New_York"のタイムゾーン)に変換する方法はありますか。具体的には、過去に生成されたLocalDateTimeオブジェクトを使用してこれを行う方法を探しています。必ずしもこの瞬間の現在の時間ではありません。

11
yalpsid eman

LocalDateTime を別のタイムゾーンに変換するには、まず atZone()を使用して元のタイムゾーンを適用しますZonedDateTime を返し、 withZoneSameInstant() 、最後に結果をLocalDateTimeに変換します。

LocalDateTime oldDateTime = LocalDateTime.parse("2015-10-10T10:00:00");
ZoneId oldZone = ZoneId.of("America/Chicago");

ZoneId newZone = ZoneId.of("America/New_York");
LocalDateTime newDateTime = oldDateTime.atZone(oldZone)
                                       .withZoneSameInstant(newZone)
                                       .toLocalDateTime();
System.out.println(newDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
2015-10-10T11:00:00

最後の手順をスキップすると、ゾーンが維持されます。

ZonedDateTime newDateTime = oldDateTime.atZone(oldZone)
                                       .withZoneSameInstant(newZone);
System.out.println(newDateTime.format(DateTimeFormatter.ISO_DATE_TIME));
2015-10-10T11:00:00-04:00[America/New_York]
30
Andreas