【问题标题】:How to format ZonedDateTime如何格式化 ZonedDateTime
【发布时间】:2019-08-29 17:16:19
【问题描述】:

我正在尝试将存储为 UTC 的日期时间转换为给定时区的日期时间。据我所知,ZonedDateTime 是正确的('America/Chicago' 比 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

【问题讨论】:

  • LocalDateTime 无法跟踪片刻。阅读类 Javadoc。

标签: java zoneddatetime java-time


【解决方案1】:

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));

【讨论】:

  • 我应该在答案中提到这一点,但 .withZoneSameInstant 所做的是使用相同的 Instant(Java 相当于 UNIX 时间戳),但更改附加到它的时区以进行格式化。 UNIX 时间戳始终以 UTC 度量。
猜你喜欢
  • 1970-01-01
  • 2020-11-27
  • 2017-07-14
  • 2020-05-30
  • 1970-01-01
  • 2018-01-29
  • 2019-05-07
  • 2020-06-26
  • 2020-12-15
相关资源
最近更新 更多