LocalDateTime 格式化程序将年份从 2020 年更改为 2021 年?
LocalDateTime formatter changing year from 2020 to 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");
其中,根据 docs,Y
表示 week-based-year
,y
表示 year-of-era
,而 u
表示简单 year
.
因此,这两个变体应该为您生成正确的年份:
DateTimeFormatter displayFormatter = DateTimeFormatter.ofPattern("MMMM d, yyyy");
DateTimeFormatter displayFormatter = DateTimeFormatter.ofPattern("MMMM d, uuuu");
现在了解为什么 y
和 Y
不同以及为什么它们会导致您的问题,我发现这已经在 SO 上讨论过:
我正在尝试采用日期格式的字符串,将其解析为 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");
其中,根据 docs,Y
表示 week-based-year
,y
表示 year-of-era
,而 u
表示简单 year
.
因此,这两个变体应该为您生成正确的年份:
DateTimeFormatter displayFormatter = DateTimeFormatter.ofPattern("MMMM d, yyyy");
DateTimeFormatter displayFormatter = DateTimeFormatter.ofPattern("MMMM d, uuuu");
现在了解为什么 y
和 Y
不同以及为什么它们会导致您的问题,我发现这已经在 SO 上讨论过: