Padrão de semana com base em semana do Java Time, analisando com DateTimeFormatter
Preciso imprimir a data atual no formatoweek-based-year
-week-of-week-based-year
, ou seja, usando oData da semana ISO onde a semana sempre começa na segunda-feira e a primeira semana do ano é a primeira que tem pelo menos quatro dias em janeiro (portanto, a semana com a primeira quinta-feira de janeiro).
Como 31 de dezembro de 2015 era uma quinta-feira, de sexta a domingo, ou seja, de 1 a 3 de janeiro de 2016, todos pertencem à 53ª semana de 2015 (um "ano longo") e a primeira semana de 2016 começa na segunda-feira, 4 de janeiro.
DeEspecificação DateTimeFormatter, Eu esperava que eu pudesse usar o padrãoYYYY-ww
fazer isso (Y
éweek-based-year
ew
éweek-of-week-based-year
)
No entanto, quando tento algo como o seguinte caso de teste simplificado:
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));
Eu entendi isso:
Parsing 2016-01-03, expected 2015-53 but got 2016-02
2016-01-03 as ISO week date: 2015-W53-7
Então, usando o built-inISO_WEEK_DATE
formatador faz o que eu esperava, mas usando o padrãoYYYY-ww
parece me dar acalendário ano e semana.
Eu entendi algo errado sobre as datas da semana ISO, ou há um erro no meu código, ou ... ouso dizer ... isso é um bug nojava.time
biblioteca (como foi o caso deessa questão)?
Sei que poderia resolver isso usando um formatador personalizado, como abaixo, mas no meu caso, realmente preciso que isso funcione usando um padrão.
new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendValue(IsoFields.WEEK_BASED_YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
.appendLiteral("-")
.appendValue(IsoFields.WEEK_OF_WEEK_BASED_YEAR, 2)
.toFormatter();