gpt4 book ai didi

java - Java 8+ 中的 DateTimeFormatter.ISO_LOCAL_DATE 与 DateTimeFormatter.ofPattern ("yyyy-MM-dd")

转载 作者:行者123 更新时间:2023-12-03 02:26:03 37 4
gpt4 key购买 nike

我使用 ZonedDateTime.now(ZoneOffset.of("+2:00")).minusDays(5) 创建了一个日期。现在我想将其格式化为 yyyy-MM-dd

在 Java 8+ 中,DateTimeFormatter.ISO_LOCAL_DATE 相当于 DateTimeFormatter.ofPattern("yyyy-MM-dd") 吗?

输出看起来相同,并且从文档来看,它们应该是相同的。然而,其中的“本地”部分让我犹豫了。请注意,我有一个偏移量并且正在使用 ZonedDateTime。我想确保没有任何陷阱或“除了在这些特殊情况下,它们是相同的,因为你正在处理偏移等”。

最佳答案

对于格式化表示 5 天前的日期时间,两个格式化程序是等效的。它们对于所有可能的日期都不是等效的,无论是对于格式化还是对于解析都是如此。

让我们尝试一下:

    DateTimeFormatter yyyyMmDd = DateTimeFormatter.ofPattern("yyyy-MM-dd");
int[] yearsToTest = { -900_000_000, -10_000, -2, 0, 1, 2017, 2099, 9999, 10_000, 900_000_000 };
for (int year : yearsToTest) {
LocalDate date = LocalDate.of(year, Month.DECEMBER, 2);
String dateFormattedIso = date.format(DateTimeFormatter.ISO_LOCAL_DATE);
String dateFormattedYyyyMmDd = date.format(yyyyMmDd);
String diff = dateFormattedIso.equals(dateFormattedYyyyMmDd) ? "Same" : "Different";
System.out.format("%-18s%-18s%s%n", dateFormattedIso, dateFormattedYyyyMmDd, diff);
}

上面的代码片段打印:

-900000000-12-02  +900000001-12-02  Different
-10000-12-02 +10001-12-02 Different
-0002-12-02 0003-12-02 Different
0000-12-02 0001-12-02 Different
0001-12-02 0001-12-02 Same
2017-12-02 2017-12-02 Same
2099-12-02 2099-12-02 Same
9999-12-02 9999-12-02 Same
+10000-12-02 +10000-12-02 Same
+900000000-12-02 +900000000-12-02 Same

因此,对于格式而言,它们似乎在公元纪年(“AD”)中是等效的,但在公元纪元之前的年份则不同。 yyyy 认为没有年份 0,因此 LocalDate 中的年份 0 被渲染为年份 1。据了解,这是 BCE,此信息不打印。 ISO 格式化程序按字面意思获取年份,包括符号和所有内容。

您可以使用 uuuu 而不是 yyyy 来获取 ISO_LOCAL_DATE 的行为。

这里的“本地”仅意味着没有时区,反过来意味着您的 ZonedDateTime 中的时区信息不会被打印,这是您意想不到的。

关于java - Java 8+ 中的 DateTimeFormatter.ISO_LOCAL_DATE 与 DateTimeFormatter.ofPattern ("yyyy-MM-dd"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47698046/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com