2016-09-20 123 views
3

我需要输出格式为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做到这一点(Yweek-based-yearwweek-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(); 

回答

3

DateTimeFormatterBuilder的文档指定“Y”附加了本地化的以周为基础的年份。因此,基于星期的年份和星期字段的含义将取决于格式化程序中设置的区域设置。

+0

好的,有趣的 - 'DateTimeFormatter'规范没有提到进场的区域设置。那么,为了获得我以后的ISO-8601“周周年”,我该怎么做?如果我通过'DateTimeFormatter.ofPattern(“YYYY-ww”)。withLocale(Locale.getDefault())')设置我自己的语言环境(“en-AU”,使用这种ISO格式,我仍然会得到相同的结果。 –

+0

其实,我只是试过locale'德国'和'法国',在这两种情况下我都会得到预期的'2015-53'。我很确定,星期日而不是星期一作为一周的第一天(这可以解释为什么它认为1月3日是第2周)只是美国的事情。但是,谢谢,我可以与它合作! –

相关问题