Java Time's Woche-für-Woche-basiertes-Jahr-Muster-Parsen mit DateTimeFormatter

Ich muss das aktuelle Datum im Format @ ausgebweek-based-year-week-of-week-based-year, d. h. unter Verwendung desISO Wochentag Wobei die Woche immer an einem Montag beginnt und die erste Woche des Jahres die erste ist, die mindestens vier Tage im Januar hat (also die Woche mit dem ersten Donnerstag im Januar).

Der 31. Dezember 2015 war ein Donnerstag, der Freitag bis Sonntag, dh der 1. bis 3. Januar 2016, und alle gehören in die 53. Woche des Jahres 2015 (ein "langes Jahr"). Die erste Woche des Jahres 2016 beginnt am Montag, dem 4. Januar .

Von demDateTimeFormatter spec, Ich hätte erwartet, dass ich nur das Muster @ verwenden kaYYYY-ww das zu tun Y istweek-based-year undw istweek-of-week-based-year).

Allerdings, wenn ich so etwas wie den folgenden vereinfachten Testfall versuche:

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));

Ich bekomme das:

Parsing 2016-01-03, expected 2015-53 but got 2016-02

2016-01-03 as ISO week date: 2015-W53-7

Also mit dem eingebautenISO_WEEK_DATE Formatierer macht, was ich erwartet hatte, aber mit dem MusterYYYY-ww scheint mir das @ zu gebKalende Jahr und Woche.

Habe ich etwas über ISO-Wochentage falsch verstanden, oder ist ein Fehler in meinem Code aufgetreten, oder ... kann ich es wagen, es zu sagen ... ist dies ein Fehler in derjava.time Bibliothek (wie beidiese Frag)?

Ich weiß, dass ich das mit einem benutzerdefinierten Formatierer wie unten umgehen könnte, aber in meinem Fall brauche ich das wirklich, um mit einem Muster zu arbeiten.

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage