DateFormatter ofPattern没有返回正确的日期

时间:2019-01-31 21:45:51

标签: java java-time localdate

我正在使用DateTimeFormatter格式化我的LocalDate,其值为31 Jan 2019。 当我执行以下代码时,将返回正确的日期:

// 31, Dec, 2018
System.out.println(LocalDate.now().minusMonths(1).format(DateTimeFormatter.ofPattern("dd, MMM, yyyy")));

但是,如果我执行以下代码,则返回的日期将带有正确的日期,月份但年份不正确:

// 31, Dec, 2019
System.out.println(LocalDate.now().minusMonths(1).format(DateTimeFormatter.ofPattern("dd, MMM, YYYY")));

让我感到困惑的是,如果我也使用上面相同的模式,而我只是minusDays(30),这使得我期望是01 Dec 2018,则会返回正确的结果:

// 01, Dec, 2018
System.out.println(LocalDate.now().minusMonths(1).minusDays(30).format(DateTimeFormatter.ofPattern("dd, MMM, YYYY")));

是否可以在YYYY模式中使用DateTimeFormatter.ofPattern("dd, MMM, YYYY")),因为?

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

class Example {
    public static void main(String[] args) {
        /*Today's date is 31st of January 2019*/

//        2018-12-31
        System.out.println(LocalDate.now().minusMonths(1));

//        31, Dec, 2018
        System.out.println(LocalDate.now().minusMonths(1).format(DateTimeFormatter.ofPattern("dd, MMM, yyyy")));

//        31, Dec, 2019
        System.out.println(LocalDate.now().minusMonths(1).format(DateTimeFormatter.ofPattern("dd, MMM, YYYY")));

//        01, Dec, 2018
        System.out.println(LocalDate.now().minusMonths(1).minusDays(30).format(DateTimeFormatter.ofPattern("dd, MMM, YYYY")));

//        31, Dec, 2018
        System.out.println(LocalDate.now().minusMonths(1).format(DateTimeFormatter.ofPattern("dd, MMM, uuuu")));
    }
}

1 个答案:

答案 0 :(得分:3)

据我了解,阅读文档的原因是: “ YY”指定基于周的年份编号,对于正常的年份编号,您应该改用“ yy”。

https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

编辑:

ISO-8601日历中的星期和年份编号与标准格里高利日历不同。这是2011年1月2日的代表方式:

Calendar System     Week Number    Year Number
Standard Gregorian     1                  2011
ISO-8601               52                 2010

格里高利安leap跃周期(跨越400年具有97个leap跃天)包含整数周(20871)。在每个周期中,有71年和另外的第53周(对应于公历年,其中包含53个星期四)。平均一年正好是52.1775周。个月(1⁄12年)平均为4.348125周。

ISO周编号的年份(也非正式地称为ISO年)有52或53个整周。那是364或371天,而不是通常的365或366天。尽管ISO 8601并未使用该术语,但额外的一周有时也被称为a周。

有关更多信息:https://en.wikipedia.org/wiki/ISO_week_date