我正在使用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")));
}
}
答案 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周。