如何格式化ZonedDateTime

时间:2019-08-29 17:16:19

标签: java zoneddatetime java.time

我正在尝试将日期时间存储为UTC,并将其转换为给定时区中的日期时间。据我所知,ZonedDateTime是正确的(“美国/芝加哥”比UTC晚5小时),但DateTimeFormatter在格式化日期时间时并未考虑偏移量。

我的挂钟时间:下午12:03

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a")
LocalDateTime now = LocalDateTime.now(ZoneOffset.UTC);
ZonedDateTime zonedDateTime = now.atZone(ZoneId.of("America/Chicago"));

log.info("Now: " + now);
log.info("Zoned date time: " + zonedDateTime);
log.info("Formatted date time: " + zonedDateTime.format(formatter));

输出:

Now: 2019-08-29T17:03:10.041
Zoned date time: 2019-08-29T17:03:10.041-05:00[America/Chicago]
Formatted date time: 08/29/2019 05:03 PM

我期望的格式化时间:08/29/2019 12:03 PM

1 个答案:

答案 0 :(得分:3)

LocalDateTime是没有时区的日期/时间。因此,您要做的是获取UTC日期时间,然后使用.atZone告诉Java该日期/时间实际上是美国/芝加哥时间,而不是将其转换为 正确的时区。

您应该做的是这样的:

ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC);
ZonedDateTime zonedDateTime = now.withZoneSameInstant(ZoneId.of("America/Chicago"));

log.info("Now: " + now);
log.info("Zoned date time: " + zonedDateTime);
log.info("Formatted date time: " + zonedDateTime.format(formatter));