ZonedDateTime.withZoneSameInstant和ZonedDateTime.withZoneSameLocal有什么区别?

2022-09-03 13:38:40

假设我有一个 ZonedDateTime:

ZonedDateTime zonedDateTime = 
     ZonedDateTime.of(LocalDateTime.now(), ZoneId.of("US/Pacific"));

我想知道在柏林是哪个日期/时间。我有两种方法:

zonedDateTime.withZoneSameInstant(ZoneId.of("Europe/Berlin")); // probably this is the right one to get the corresponding date/time in Berlin

zonedDateTime.withZoneSameLocal(ZoneId.of("Europe/Berlin"));

该方法的文档说:“仅当本地日期时间对于新区域无效时,才会更改它...”目前还不清楚这是否真的会发生(任何例子? =))。withZoneSameLocal

它们分别代表哪个日期/时间,有什么区别?


答案 1

如果要将时间戳从一个时区转换为另一个时区,请使用 。 将更改区域,但保持所有其他字段相同。例外情况是,在该时区中,该日期无效。withZoneSameInstant()withZoneSameLocal()

例如

ZonedDateTime dtUTC = ZonedDateTime.parse("2019-03-10T02:30:00Z");
ZoneId pacific = ZoneId.of("US/Pacific");
System.out.println(dtUTC.withZoneSameInstant(pacific));
System.out.println(dtUTC.withZoneSameLocal(pacific));

指纹

2019-03-09T18:30-08:00[US/Pacific]
2019-03-10T03:30-07:00[US/Pacific]

第一行是转换为其他时区的原始时间戳。第二个尝试保留日期/时间字段,但 2:30 不是该日期的有效时间(由于夏令时跳转),因此它会将其偏移一小时。


答案 2

推荐