【问题标题】:Java ZonedDateTime.format issue [duplicate]Java ZonedDateTime.format 问题[重复]
【发布时间】:2021-04-08 04:50:12
【问题描述】:

遇到ZonedDateTime 格式问题。它将 2020 年 12 月末的日期格式化为 2021 年的日期。 Java sn-p

ZonedDateTime z1 = ZonedDateTime.of(LocalDateTime.of(2020, 12, 31, 0, 0), ZoneId.of("America/New_York"));
z1.format(DateTimeFormatter.ofPattern("YYYY-MM-dd"))
// yields "2021-12-31"

12 月 28 日、29 日、30 日也是如此。不同时区的结果相同。 2019 年 12 月 30 日重复(格式为 2020-12-30)。

原始 Clojure sn-p

(let [zdt (ZonedDateTime/of (LocalDateTime/of 2020 12 31 0 0) (ZoneId/of "America/New_York"))
      f (DateTimeFormatter/ofPattern "YYYY-MM-dd")]
  (.format zdt f))
; => "2021-12-31"

我能够复制:

  • MacOS HotSpot Java 10(Java 版本“10.0.2”2018-07-17)
  • OpenJDK 版本“11.0.9.1”2020-11-04

如果您对 Lisps 没问题 - 您可以在云 REPL here 中亲自查看它

【问题讨论】:

    标签: java zoneddatetime datetimeformatter


    【解决方案1】:

    将模式字符串更改为yyyy-MM-dd。 参考javadocDateTimeFormatter了解YYYYyyyy的区别。

    ZonedDateTime z1 = ZonedDateTime.of(LocalDateTime.of(2020, 12, 31, 0, 0), ZoneId.of("America/New_York"));
    System.out.println(z1.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
    

    结果:

    2020-12-31
    

    【讨论】:

    • 是的,行得通
    【解决方案2】:

    好的,找到了。这只是我的格式错误。

    • Y 表示基于周的年份
    • y 代表时代
    • 你只是一年

    所以使用"uuuu-MM-dd" 就可以了

    【讨论】:

    • 或者,更简单地说,DateTimeFormatter.ISO_LOCAL_DATE
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 2011-03-21
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多