Разбор строки к локальной дате не использует желаемый век
Я использую этот DateTimeFormatter:
DateTimeFormatter.ofPattern("ddMMYY")
Я хочу разобрать строку 150790
и я получил эту ошибку:
Unable to obtain LocalDate from TemporalAccessor: {DayOfMonth=15, MonthOfYear=7, WeekBasedYear[WeekFields[MONDAY,4]]=2090},ISO of type java.time.format.Parsed
Очевидно, я хочу получить следующее TemporalAccessor
:
{DayOfMonth=15, MonthOfYear=7, WeekBasedYear=1990}
Вы знаете, почему я получил 2090 год вместо 1990?
Спасибо за вашу помощь
1 ответ
Так как этот вопрос действительно о новом java.time
пакет и НЕ SimpleDateFormat
Я процитирую следующий соответствующий раздел:
Год: Количество букв определяет минимальную ширину поля, ниже которой используется заполнение. Если количество букв равно двум, то используется сокращенная двухзначная форма. Для печати выводятся две самые правые цифры. Для синтаксического анализа это будет проанализировано с использованием базового значения 2000, что приведет к году в диапазоне от 2000 до 2099 включительно.
Мы видим, что Java-8 использует диапазон 2000-2099 по умолчанию, а не как SimpleDateFormat
диапазон от -80 лет до +20 лет относительно сегодняшнего дня.
Если вы хотите настроить его, вы должны использовать appendValueReduced (). Это спроектировано неудобным способом, но возможно, смотрите здесь:
String s = "150790";
// old code with base range 2000-2099
DateTimeFormatter dtf1 =
new DateTimeFormatterBuilder().appendPattern("ddMMyy").toFormatter();
System.out.println(dtf1.parse(s)); // 2090-07-15
// improved code with base range 1935-2034
DateTimeFormatter dtf2 =
new DateTimeFormatterBuilder().appendPattern("ddMM")
.appendValueReduced(
ChronoField.YEAR, 2, 2, Year.now().getValue() - 80
).toFormatter();
System.out.println(dtf2.parse(s)); // 1990-07-15
Кстати, если вам действительно нужны недельные годы, тогда вам нужно использовать Y вместо y или соответствующее поле IsoFields.WEEK_BASED_YEAR
, Что касается того, что у вас нет никаких других связанных с неделей полей, я бы предположил, что это обычный календарный год, а не недельный.