Java ZonedDateTime.format 问题

问题描述

遇到 zoneddatetime 格式问题。它将 2020 年 12 月的结束日期格式化为 2021 年的日期。 Java 代码

zoneddatetime z1 = zoneddatetime.of(LocalDateTime.of(2020,12,31,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 片段

(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

解决方法

将模式字符串更改为 yyyy-MM-dd。 请参阅 DateTimeFormatter 类的 javadoc 以了解 YYYYyyyy 之间的区别。

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

结果:

2020-12-31
,

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

  • Y 表示基于周的年
  • y 代表纪元
  • 你只是一年

所以使用 "uuuu-MM-dd" 一切正常

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...