Qual é a motivação para duas definições diferentes de semana com base no ano no JSR-310?

Estes são os dois campos no pacotejava.time.temporal:

IsoFields.WEEK_BASED_YEAR

WeekFields.ISO.weekBasedYear ()

A ISO-8601 define a chamada data da semana além dos outros dois tipos de data, a saber, a data habitual do calendário (que consiste em ano, mês e dia do mês) e a data ordinal (que consiste em ano e dia do ano). )Uma data da semana é definida no formato AAAA-'W'ww-e. w representa a semana do ano, e o ISO-dia-da-semana numérico. Y representa o ano com base na semana e é idêntico ao ano civil, com exceção no início ou no final do ano civil, porque um ano baseado na semana está vinculado ao ciclo da semana que pode começar no ano anterior. Duas regras são importantes para entender como uma data da semana é formada:

As semanas sempre começam na segunda-feira.A primeira semana de um ano civil é a semana que contém pelo menos quatro dias.

À primeira vista, os dois campos JSR-310 parecem idênticos porque a ISO-8601 menciona apenas um tipo de semana com base no ano. Mas espere, surpresa. Vamos considerar o seguinte exemplo 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

Embora eu entenda muito bem a segunda variação, estou realmente surpreso ao ver o resultado diferente da primeira data, que está usando a referência "oficial" ISO-8601 em seu nome de classe. Para explicar os resultados calculados:

A data 2000-02-29 corresponde a 2000-W09-2 na notação ISO-weekdate, enquanto a 2014-02-25 corresponde a 2014-W09-2preservando a semana do ano e o dia da semana. Até aqui tudo bem. Essas características de preservação para campos menores são semelhantes à regra de como alterar o ano civil (que na maioria dos casos deve manter o mês e o dia do mês em uma data do calendário inalterada).

Mas e o resultado 01/03/2014? Aqui, o algoritmo simplesmente adicionou quatro dias à data da semana correspondente para levar em consideração a diferença no campo "dia do mês" (29 versus 25). Não encontrei nenhuma fonte ou documentação oficial para esse comportamento. Alguém sabe onde podemos encontrar a justificativa para a diferença entre esses dois campos? Existe alguma documentação disponível sobre o comportamento algorítmico?

ATUALIZAR:

Agora, tentei testar a auto-consistência da nova API com esta expressão para descobrir qual dos dois campos é melhor suportado:

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

O resultado é 01/03/2014 - semelhante ao caso descrito deIsoFields.WEEK_BASED_YEAR, embora eu ainda ache o resultado 25/02/2014 (= 2014-W09-2) muito mais lógico. Como essa unidade temporal também é encontrada na classeIsoFields até agora, o comportamento é auto-consistente dentro da classeIsoFields. Parece um "recurso" não documentado e não intuitivo.

Estou usando a versão:java.runtime.version = 1.8.0-b132

Mais testes:

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

Resultado:

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

Não reconheço nenhuma regra clara. Nem o dia da semana é preservado nem o dia do mês, ao adicionar 14 anos com base na semana.Portanto, esta é uma pergunta extra: qual é a regra por trásIsoFields.WEEK_BASED_YEARS? Talvez a equipe JSR-310 possa nos esclarecer?

questionAnswers(1)

yourAnswerToTheQuestion