我需要输出格式为week-based-year
- week-of-week-based-year
的当前日期,即使用ISO week date,其中星期始终始于星期一和星期的第一周今年1月份是第一次至少有四天的时间(所以在一月份的第一个星期四的一周)。使用DateTimeFormatter解析Java时间的星期几周模式
自2015年12月31日起,周五,周五至周日,即2016年1月1日至3日,全部属于2015年第53周(“漫长的一年”),2016年第一周开始于周一1月4日。
从DateTimeFormatter spec,我本来期望,我可以只使用模式YYYY-ww
做到这一点(Y
是week-based-year
和w
是week-of-week-based-year
)。
然而,当我尝试像下面简单的测试案例:
String dateString = "2016-01-03";
LocalDate date = LocalDate.parse(dateString, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
String expectedOutput = "2015-53";
String actualOutput = date.format(DateTimeFormatter.ofPattern("YYYY-ww"));
System.out.println("Parsing " + dateString + ", expected "
+ expectedOutput + " but got " + actualOutput);
System.out.println(dateString + " as ISO week date: "
+ date.format(DateTimeFormatter.ISO_WEEK_DATE));
我得到这个:
Parsing 2016-01-03, expected 2015-53 but got 2016-02
2016-01-03 as ISO week date: 2015-W53-7
因此,使用内置-in ISO_WEEK_DATE
formatter做我的预期,但使用YYYY-ww
模式似乎给了我日历年和周。
我是否误解了关于ISO日期日期的事情,或者在我的代码中是否有错误,或者...我敢说这是...这是java.time
库中的错误(如this question的情况)?
我知道我可以使用像下面这样的自定义格式化工具来解决此问题,但在我的情况下,我真的需要使用这种模式。
new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendValue(IsoFields.WEEK_BASED_YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
.appendLiteral("-")
.appendValue(IsoFields.WEEK_OF_WEEK_BASED_YEAR, 2)
.toFormatter();
好的,有趣的 - 'DateTimeFormatter'规范没有提到进场的区域设置。那么,为了获得我以后的ISO-8601“周周年”,我该怎么做?如果我通过'DateTimeFormatter.ofPattern(“YYYY-ww”)。withLocale(Locale.getDefault())')设置我自己的语言环境(“en-AU”,使用这种ISO格式,我仍然会得到相同的结果。 –
其实,我只是试过locale'德国'和'法国',在这两种情况下我都会得到预期的'2015-53'。我很确定,星期日而不是星期一作为一周的第一天(这可以解释为什么它认为1月3日是第2周)只是美国的事情。但是,谢谢,我可以与它合作! –