根据当前时区与东部时区的时差更改 LocalDateTime

2022-09-01 21:40:41

假设一周前我生成了一个 LocalDateTime 2015-10-10T10:00:00。此外,让我们假设我生成了当前的时区ID。

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

我的 zoneId 是“美国/芝加哥”。

有没有一种简单的方法可以将我的LocalDateTime转换为时区ID“America/New_York”的一个(即,我更新的LocalDateTime将是2015-10-10T11:00:00)?

更重要的是,无论我身处哪个时区,有没有办法将我的LocalDateTime转换为东部时间(即,转换为zoneId为“America/New_York”的时区)?我专门寻找一种方法来对过去生成的任何LocalDateTime对象执行此操作,而不一定是当前时间。


答案 1

要将 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]

答案 2