¿Cuál es la motivación para dos definiciones diferentes de año por semana en JSR-310?

Estos son los dos campos del paquete.java.time.temporal:

IsoFields.WEEK_BASED_YEAR

WeekFields.ISO.weekBasedYear ()

ISO-8601 define una llamada fecha de semana además de los otros dos tipos de fecha, a saber, la fecha de calendario habitual (que consiste en año, mes y día del mes) y la fecha ordinal (que consiste en año y día del año )Una fecha de semana se define en el formato AAAA-'W'ww-e. w representa la semana del año, e significa el ISO numérico del día de la semana. Y representa el año basado en la semana y es idéntico al año calendario con la excepción al comienzo o al final del año calendario, porque un año basado en la semana está vinculado al ciclo de la semana que eventualmente puede comenzar en el año anterior. Dos reglas son importantes para entender cómo se forma una fecha de semana:

Las semanas siempre comienzan los lunes.La primera semana de un año calendario es la semana que contiene al menos cuatro días.

A primera vista, ambos campos JSR-310 parecen ser idénticos porque ISO-8601 solo menciona un tipo de año basado en la semana. Pero espera, sorpresa. Consideremos el siguiente ejemplo de código:

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

Si bien entiendo muy bien la segunda variación, estoy realmente asombrado de ver el resultado diferente para la primera fecha que usa la referencia "oficial" ISO-8601 en su nombre de clase. Para explicar los resultados calculados:

La fecha 2000-02-29 corresponde a 2000-W09-2 en ISO-weekdate-notation mientras que 2014-02-25 corresponde a 2014-W09-2preservando la semana del año y el día de la semana. Hasta ahora todo bien. Esta característica de preservación para campos más pequeños es similar a la regla de cómo cambiar el año calendario (que en la mayoría de los casos debería mantener el mes y el día del mes sin cambios).

Pero, ¿qué pasa con el resultado 2014-03-01? Aquí el algoritmo simplemente ha agregado cuatro días a la fecha de la semana correspondiente para tener en cuenta la diferencia en el campo "día del mes" (29 frente a 25). No he encontrado ninguna fuente o documentación oficial para este comportamiento. ¿Alguien sabe dónde podemos encontrar la justificación de la diferencia entre estos dos campos? ¿Alguna documentación disponible sobre el comportamiento algorítmico?

ACTUALIZAR:

Ahora intenté probar la autoconsistencia de la nueva API con esta expresión para averiguar cuál de los dos campos es mejor compatible:

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

El resultado es 2014-03-01 similar al caso descrito deIsoFields.WEEK_BASED_YEAR, aunque todavía encuentro el resultado 2014-02-25 (= 2014-W09-2) mucho más lógico. Dado que esta unidad temporal también se encuentra en la claseIsoFields hasta ahora el comportamiento es autoconsistente dentro de la claseIsoFields. Parece una "característica" indocumentada y no intuitiva.

Estoy usando la versión:java.runtime.version = 1.8.0-b132

Más pruebas:

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

Salida:

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

No reconozco ninguna regla clara. Ni el día de la semana se conserva ni el día del mes se conserva mientras se agregan 14 años basados en la semana.Entonces esta es una pregunta extra: ¿Cuál es la regla detrás deIsoFields.WEEK_BASED_YEARS? ¿Quizás el equipo JSR-310 puede iluminarnos?

Respuestas a la pregunta(1)

Su respuesta a la pregunta