Синтаксический анализ шаблона времени недели в году в Java Time с DateTimeFormatter
Мне нужно вывести текущую дату в форматеweek-based-year
-week-of-week-based-year
то есть используяДата недели ISO где неделя всегда начинается в понедельник, а первая неделя года - первая, в которой не менее четырех дней в январе (таким образом, неделя с первым четвергом в январе).
Поскольку 31 декабря 2015 года был четверг, с пятницы по воскресенье, то есть с 1 по 3 января 2016 года, все они относятся к 53-й неделе 2015 года («длинный год»), а первая неделя 2016 года начинается в понедельник, 4 января.
ОтDateTimeFormatter specЯ бы ожидал, что я могу просто использовать шаблонYYYY-ww
сделать это (Y
являетсяweek-based-year
а такжеw
являетсяweek-of-week-based-year
).
Тем не менее, когда я пытаюсь что-то вроде следующего упрощенного теста:
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));
Я получаю это:
Parsing 2016-01-03, expected 2015-53 but got 2016-02
2016-01-03 as ISO week date: 2015-W53-7
Так что с помощью встроенногоISO_WEEK_DATE
форматтер делает то, что я ожидал, но с использованием шаблонаYYYY-ww
кажется, дает мнекалендарь год и неделю.
Неужели я что-то неправильно понял о датах недели ISO, или в моем коде есть ошибка, или ... осмелюсь это сказать ... это ошибка вjava.time
библиотека (как было в случае сэтот вопрос)?
Я знаю, что могу обойти это, используя пользовательский форматер, как показано ниже, но в моем случае мне действительно нужно это для работы с использованием шаблона.
new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendValue(IsoFields.WEEK_BASED_YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
.appendLiteral("-")
.appendValue(IsoFields.WEEK_OF_WEEK_BASED_YEAR, 2)
.toFormatter();