DateTimeFormatter diff com base em semana e ano
Estou migrando meu aplicativo do Joda-Time para o Java 8java.time
.
Uma das coisas que encontrei é a impressão de um ano baseado em uma semana usando um padrão noDateTimeFormatter
.
NOTA: Vi esta pergunta:Padrão de semana com base em semana do Java Time, analisando com DateTimeFormatter
De acordo com a documentação
y year-of-era year 2004; 04
Y week-based-year year 1996; 96
No entanto, quando eu tento esses dois, parece que oY
está sempre retornando o mesmo quey
.
Meu código de teste:
DateTimeFormatter yearF = DateTimeFormatter.ofPattern("yyyy").withZone(ZoneOffset.UTC);
DateTimeFormatter weekYearF = DateTimeFormatter.ofPattern("YYYY").withZone(ZoneOffset.UTC);
DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder()
.appendValue(ChronoField.YEAR_OF_ERA) .appendLiteral(" ") .append(yearF)
.appendLiteral(" -- ")
.appendValue(IsoFields.WEEK_BASED_YEAR) .appendLiteral(" ") .append(weekYearF)
.toFormatter()
.withZone(ZoneOffset.UTC);
System.out.println(dateTimeFormatter.toString());
ZonedDateTime dateTime = ZonedDateTime.ofInstant(Instant.ofEpochMilli(946778645000L), ZoneOffset.UTC);
for (int i = 2000 ; i < 2020; i ++ ) {
System.out.println(dateTime.withYear(i).format(dateTimeFormatter));
}
A saída:
Value(YearOfEra)' '(Value(YearOfEra,4,19,EXCEEDS_PAD))' -- 'Value(WeekBasedYear)' '(Localized(WeekBasedYear,4,19,EXCEEDS_PAD))
2000 2000 -- 1999 2000
2001 2001 -- 2001 2001
2002 2002 -- 2002 2002
2003 2003 -- 2003 2003
2004 2004 -- 2004 2004
2005 2005 -- 2004 2005
2006 2006 -- 2006 2006
2007 2007 -- 2007 2007
2008 2008 -- 2008 2008
2009 2009 -- 2009 2009
2010 2010 -- 2009 2010
2011 2011 -- 2010 2011
2012 2012 -- 2012 2012
2013 2013 -- 2013 2013
2014 2014 -- 2014 2014
2015 2015 -- 2015 2015
2016 2016 -- 2015 2016
2017 2017 -- 2017 2017
2018 2018 -- 2018 2018
2019 2019 -- 2019 2019
Observando os anos em que isso é importante (como 2000, 2005, 2009 e 2016), a produção de.appendValue(IsoFields.WEEK_BASED_YEAR)
e.ofPattern("YYYY")
são diferentes.
NoPadrão de semana com base em semana do Java Time, analisando com DateTimeFormatter afirma-se que isso tem a ver com a localização (como pode ser visto claramente como uma diferença natoString()
doDateTimeFormatter
)
Agora, existem poucas coisas que eu não entendo / preciso:
Portanto, o "ano com base na semana" varia de acordo com a localidade, tudo bem. No entanto, o que eu não entendo é que, aparentemente, em algumas localidades, o ano base da semana é sempre idêntico ao ano 'normal'. Por que é que?
Por que a análise doYYYY
foi mapeado para a definição ISO-8601 em vez do formulário localizado (terrivelmente confuso!)
Onde posso encontrar a documentação adequada disso? A aparente documentação "oficial" da Oracle é vaga, para dizer o mínimo.Responda: Encontrei documentação muito mais extensa com oDateTimeFormatterBuilder.