【问题标题】:Java Time's week-of-week-based-year pattern parsing with DateTimeFormatter使用 DateTimeFormatter 解析 Java Time 的基于星期的年份模式
【发布时间】:2017-01-27 19:16:33
【问题描述】:

我需要以week-based-year-week-of-week-based-year 的格式输出当前日期,即使用ISO week date,其中一周总是从星期一开始,一年中的第一周是第一个至少有一月份有四天(所以是一月份第一个星期四所在的那一周)。

由于 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

所以使用内置的 ISO_WEEK_DATE 格式化程序可以达到我的预期,但使用模式 YYYY-ww 似乎给了我日历年和周。

我是否误解了有关 ISO 周日期的某些内容,或者我的代码中是否有错误,或者...我敢说...这是 java.time 库中的错误(就像 @987654323 的情况一样@)?

我知道我可以使用如下的自定义格式化程序来解决这个问题,但就我而言,我真的需要使用模式来解决这个问题。

new DateTimeFormatterBuilder()
    .parseCaseInsensitive()
    .appendValue(IsoFields.WEEK_BASED_YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
    .appendLiteral("-")
    .appendValue(IsoFields.WEEK_OF_WEEK_BASED_YEAR, 2)
    .toFormatter();

【问题讨论】:

    标签: java java-8 java-time iso8601


    【解决方案1】:

    DateTimeFormatterBuilder 的文档指定“Y”附加本地化的基于周的年份。因此,基于周的年和周字段的含义将取决于格式化程序中设置的语言环境。

    【讨论】:

    • 好吧,很有趣——DateTimeFormatter 规范没有提到语言环境的作用。那么我该怎么做才能获得我所追求的 ISO-8601“基于周的年”?如果我设置自己的语言环境(“en-AU”,通过DateTimeFormatter.ofPattern("YYYY-ww").withLocale(Locale.getDefault())),使用这种 ISO 格式,我仍然会得到相同的结果。
    • 实际上,我只是尝试了语言环境GERMANYFRANCE,在这两种情况下我都得到了预期的2015-53。我非常确定使用星期日而不是星期一作为一周的第一天(这可以解释为什么它认为 1 月 3 日是第 2 周)只是美国事物。但是谢谢,我可以用它!
    猜你喜欢
    • 1970-01-01
    • 2018-03-05
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 2010-12-09
    相关资源
    最近更新 更多