DateTimeFormatter.ISO_LOCAL_DATE 对比 DateTimeFormatter.ofPattern("yyyy-MM-dd") 在 Java 8+
DateTimeFormatter.ISO_LOCAL_DATE vs DateTimeFormatter.ofPattern("yyyy-MM-dd") in Java 8+
我有一个使用 ZonedDateTime.now(ZoneOffset.of("+2:00")).minusDays(5)
创建的约会对象。现在我想将其格式化为 yyyy-MM-dd
.
在 Java 8+ 中,DateTimeFormatter.ISO_LOCAL_DATE
是否等同于 DateTimeFormatter.ofPattern("yyyy-MM-dd")
?
输出看起来是一样的,从文档来看,它们应该是一样的。但是,其中的 "LOCAL" 部分让我犹豫了。请注意我有一个偏移量并且我正在使用 ZonedDateTime。我想确保没有任何问题或 "they're the same except under these special circumstances since you're dealing with offsets, etc".
对于表示 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
的时区信息没有被打印出来,这是你无论如何都不会想到的。
这里的ISO表示ISO-8601。该格式目前是,并且可能永远是,yyyy-MM-dd(没有时区,因为它是本地的)。但是问问自己——你想要 ISO 格式,还是想要 yyyy-MM-dd?它们相同的事实对您来说应该是微不足道的 - 您正在根据想要标准表示或想要特定表示来做出决定。或者也许问题是 "I'm not sure if I want an ISO format date...do I?" - 答案是,一切都一样,你可能会这样做。
我有一个使用 ZonedDateTime.now(ZoneOffset.of("+2:00")).minusDays(5)
创建的约会对象。现在我想将其格式化为 yyyy-MM-dd
.
在 Java 8+ 中,DateTimeFormatter.ISO_LOCAL_DATE
是否等同于 DateTimeFormatter.ofPattern("yyyy-MM-dd")
?
输出看起来是一样的,从文档来看,它们应该是一样的。但是,其中的 "LOCAL" 部分让我犹豫了。请注意我有一个偏移量并且我正在使用 ZonedDateTime。我想确保没有任何问题或 "they're the same except under these special circumstances since you're dealing with offsets, etc".
对于表示 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
的时区信息没有被打印出来,这是你无论如何都不会想到的。
这里的ISO表示ISO-8601。该格式目前是,并且可能永远是,yyyy-MM-dd(没有时区,因为它是本地的)。但是问问自己——你想要 ISO 格式,还是想要 yyyy-MM-dd?它们相同的事实对您来说应该是微不足道的 - 您正在根据想要标准表示或想要特定表示来做出决定。或者也许问题是 "I'm not sure if I want an ISO format date...do I?" - 答案是,一切都一样,你可能会这样做。