【问题标题】:LocalDate formatter bug? [duplicate]LocalDate 格式化程序错误? [复制]
【发布时间】:2020-05-08 16:37:35
【问题描述】:

我在 12 月 30 日和 31 日在 LocalDate 上使用 Java 的 DateTimeFormatter 时发现了奇怪的行为。

LocalDate date1 = LocalDate.of(2019, Month.DECEMBER, 30);
System.out.println("date1:           " + date1);
System.out.println("converted date1: " + DateTimeFormatter.ofPattern("YYYY-MM-dd").format(date1));

LocalDate date2 = LocalDate.of(2019, Month.JANUARY, 30);
System.out.println("date2:           " + date2);
System.out.println("converted date2: " + DateTimeFormatter.ofPattern("YYYY-MM-dd").format(date2));

输出:

date1:           2019-12-30
converted date1: 2020-12-30
date2:           2019-01-30
converted date2: 2019-01-30

第一个日期(12 月 30 日)转换为下一年,第二个日期(1 月 30 日)转换为正确的年份。

是我遗漏了什么,还是一个错误?

【问题讨论】:

  • 您可能想要yyyy 而不是YYYY。你需要小心这些模式,它们不仅仅是随机的字母。
  • 一个方便的提示要牢记:blog.codinghorror.com/…

标签: java date date-formatting localdate


【解决方案1】:

Y 表示“基于周的年份”。它与y 不同,docs 表示“时代”。

This post解释Y的区别和用途:

一周年是一年中所有周都是整周的年份。这是由某个标准指定的(我现在不记得了)。基本上,这保证了处理一周数据的程序不会在几年之间转换。不幸的是,这也意味着年初可能不会从一月一日开始。某一天属于哪一年取决于这些规则,当然,也有年份和星期年份不同的日子。

在您的示例中,2019 年 12 月 30 日是星期一,2019 年 12 月 31 日是星期二,20 年 1 月 1 日是星期三,因此这三天的“基于周的年份”是 2020。

【讨论】:

  • 我想说“Y 表示“基于周的年份”,y 表示“时代的年份””只是为了超级清楚。
  • 经验教训 - 谢谢 :)
【解决方案2】:

将“Y”更改为“y”(将大写字母改为小写字母)“Y”是基于周的年份,由于 2019 年 12 月 30 日这一周的大部分时间都属于 2020 年,因此该年份是 2020 年。而小写的“y” ' 是你的常规年份。有关详细信息,请参阅DateTimeFormatter 的 JavaDoc

【讨论】:

  • 也谢谢迈克尔 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 2017-06-24
相关资源
最近更新 更多