Was ist die Motivation für zwei verschiedene wochenbasierte Jahresdefinitionen in JSR-310?

Dies sind die beiden Felder im Paketjava.time.temporal:

IsoFields.WEEK_BASED_YEAR

WeekFields.ISO.weekBasedYear ()

ISO-8601 definiert neben den beiden anderen Datumsarten ein sogenanntes Wochentagsdatum, nämlich das übliche Kalenderdatum (bestehend aus Jahr, Monat und Tag des Monats) und das Ordnungsdatum (bestehend aus Jahr und Tag des Jahres) ).Ein Wochentag ist im Format JJJJ-'W'ww-e definiert. w steht für die Woche des Jahres, e für den numerischen ISO-Wochentag. Y steht für das wochenbasierte Jahr und ist identisch mit dem Kalenderjahr, mit Ausnahme von Beginn oder Ende des Kalenderjahres, da ein wochenbasiertes Jahr an den Wochenzyklus gebunden ist, der eventuell im Vorjahr beginnen kann. Zwei Regeln sind wichtig, um zu verstehen, wie ein Wochentag gebildet wird:

Wochen beginnen immer am Montag.Die erste Woche eines Kalenderjahres ist die Woche, die mindestens vier Tage enthält.

Auf den ersten Blick scheinen beide JSR-310-Felder identisch zu sein, da ISO-8601 nur eine Art von wochenbasiertem Jahr erwähnt. Aber warte, Überraschung. Betrachten wir folgendes Codebeispiel:

LocalDate date1 = 
  LocalDate.of(2000, 2, 29).with(IsoFields.WEEK_BASED_YEAR, 2014);
System.out.println("IsoFields-Test: " + date1); // output: 2014-03-01

LocalDate date2 = 
  LocalDate.of(2000, 2, 29).with(WeekFields.ISO.weekBasedYear(), 2014);
System.out.println("WeekFields-Test: " + date2); // output: 2014-02-25

Obwohl ich die zweite Variante sehr gut verstehe, bin ich wirklich erstaunt, das unterschiedliche Ergebnis für das erste Datum zu sehen, bei dem die "offizielle" ISO-8601-Referenz in ihrem Klassennamen verwendet wird. So erklären Sie die berechneten Ergebnisse:

Das Datum 2000-02-29 entspricht 2000-W09-2 in ISO-Weekdate-Notation, während das Datum 2014-02-25 dem Datum 2014-W09-2 entsprichtBewahrung der Woche des Jahres und des Wochentags. So weit so gut. Diese Beibehaltungsmerkmale für kleinere Felder ähneln der Regel zum Ändern des Kalenderjahres (wobei in den meisten Fällen der Monat und der Tag des Monats in einem Kalenderdatum unverändert bleiben sollten).

Aber was ist mit dem Ergebnis 2014-03-01? Hier hat der Algorithmus dem entsprechenden Wochentag einfach vier Tage hinzugefügt, um die Differenz im Feld "Tag des Monats" (29 gegenüber 25) zu berücksichtigen. Ich habe keine Quelle oder offizielle Dokumentation für dieses Verhalten gefunden. Weiß jemand, wo wir die Rechtfertigung für den Unterschied zwischen diesen beiden Bereichen finden können? Gibt es eine Dokumentation zum algorithmischen Verhalten?

AKTUALISIEREN:

Nun habe ich versucht, die Selbstkonsistenz der neuen API mit diesem Ausdruck zu testen, um herauszufinden, welches der beiden Felder besser unterstützt wird:

System.out.println(
  "14 week-based-years later = "
  + LocalDate.of(2000, 2, 29).plus(14, IsoFields.WEEK_BASED_YEARS));

Die Ausgabe ist 2014-03-01 ähnlich dem beschriebenen Fall vonIsoFields.WEEK_BASED_YEAR, obwohl ich das Ergebnis vom 25.02.2014 (= 2014-W09-2) noch viel logischer finde. Da diese zeitliche Einheit auch in der Klasse zu finden istIsoFields Bisher ist das Verhalten in der Klasse selbstkonsistentIsoFields. Sieht aus wie ein undokumentiertes und nicht intuitives "Feature".

Ich benutze die Version:java.runtime.version = 1.8.0-b132

Weitere Tests:

LocalDate d = LocalDate.of(2014, 3, 1); // 2014-W09-6
System.out.println(
  "week-of-year in 2014-03-01: " 
  + d.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR));
System.out.println(
  "day-of-week in 2014-03-01: " 
  + d.get(ChronoField.DAY_OF_WEEK));

LocalDate later = d.plus(14, IsoFields.WEEK_BASED_YEARS); // 2028-03-02 = 2028-W09-4
System.out.println(
  "14 week-based-years later = " 
  + later);
System.out.println(
  "week-of-year in " + later + ": " 
  + later.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR));
System.out.println(
  "day-of-week in " + later + ": " 
  + later.get(ChronoField.DAY_OF_WEEK));

Ausgabe:

week-of-year in 2014-03-01: 9
day-of-week in 2014-03-01: 6
14 week-based-years later = 2028-03-02
week-of-year in 2028-03-02: 9
day-of-week in 2028-03-02: 4

Ich erkenne keine klare Regel. Weder der Wochentag noch der Monatstag werden beibehalten, wenn 14 wochenbasierte Jahre hinzugefügt werden.Das ist also eine zusätzliche Frage: Was ist die Regel dahinter?IsoFields.WEEK_BASED_YEARS? Vielleicht kann uns das JSR-310-Team aufklären?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage