класс.
евожу свое приложение из Joda-Time на Java 8java.time
.
Одна из вещей, с которыми я столкнулся, - это печать недельного года с использованием шаблона вDateTimeFormatter
.
ПРИМЕЧАНИЕ: я видел этот вопрос:Синтаксический анализ шаблона времени недели в году в Java Time с DateTimeFormatter
Согласно документации
y year-of-era year 2004; 04
Y week-based-year year 1996; 96
Тем не менее, когда я пытаюсь эти два, кажется,Y
всегда возвращает так же, какy
.
Мой тестовый код:
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));
}
Выход:
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
Глядя на годы, когда это имеет значение (например, 2000, 2005, 2009 и 2016), результат.appendValue(IsoFields.WEEK_BASED_YEAR)
а также.ofPattern("YYYY")
разные.
ВСинтаксический анализ шаблона времени недели в году в Java Time с DateTimeFormatter указано, что это связано с локализацией (что можно ясно увидеть как разницу вtoString()
изDateTimeFormatter
).
Теперь есть несколько вещей, которые я не понимаю / нуждаюсь:
Так что «недельный год» зависит от локали, хорошо. Тем не менее, я не понимаю, что, по-видимому, в некоторых регионах базовый год недели всегда идентичен «нормальному» году. Почему это?
Почему не разборYYYY
был сопоставлен с определением ISO-8601 вместо (ужасно запутанной!) локализованной формы.
Где я могу найти соответствующую документацию этого? Кажущаяся «официальная» документация от Oracle неопределенна, если не сказать больше.Ответ: Я нашел гораздо более обширную документацию сDateTimeFormatterBuilder.