LocalDateTime 格式化程序将年份从 2020 年更改为 2021 年?

问题描述

我正在尝试采用日期格式的字符串,将其解析为 LocalDateTime,然后将其格式化回字符串进行显示。这样做时我发现原始字符串是 2020 年,LocalDateTime 对象也有 2020 年。但是当我格式化 LocalDateTime 以进行显示时,这个字符串不知何故现在是 2021 年?代码如下:

public class LocalDateTimeTry {
public static void main(String[] args) {
    String originalData = "2020-12-29T20:01:06+0000";
    
    DateTimeFormatter originalFormatter = 
        DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxxx");
        
    LocalDateTime originalParsed 
        = LocalDateTime.parse(originalData,originalFormatter); 
    
    DateTimeFormatter displayFormatter
        = DateTimeFormatter.ofPattern("MMMM d,YYYY");
    
    String displayFormatted
        = displayFormatter.format(originalParsed);
    
    System.out.printf("Original String of data : %s%n",originalData);
    System.out.printf("LocalDateTime.toString(): %s%n",originalParsed.toString());
    System.out.printf("Formatted for display   : %s%n",displayFormatted);
}
}

输出如下所示:查看年份从 2020 年到 2021 年的变化。

Original String of data : 2020-12-29T20:01:06+0000
LocalDateTime.toString(): 2020-12-29T20:01:06
Formatted for display   : December 29,2021

有什么想法吗??

解决方法

正如@Andy Turner 在评论中指出的那样,问题来自于这个声明:

DateTimeFormatter displayFormatter = DateTimeFormatter.ofPattern("MMMM d,YYYY");

其中,根据 docsY 表示 week-based-yeary 表示 year-of-era,而 u 仅表示 {{1 }}。

因此,这两个变体应该为您生成正确的年份:

year

现在要了解为什么 DateTimeFormatter displayFormatter = DateTimeFormatter.ofPattern("MMMM d,yyyy"); DateTimeFormatter displayFormatter = DateTimeFormatter.ofPattern("MMMM d,uuuu"); y 不同以及它们为什么会导致您的问题,我发现这已经在 SO 上讨论过:https://stackoverflow.com/a/62690443/9698467

相关问答

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