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?" - 答案是,一切都一样,你可能会这样做。