При синтаксическом анализе строки на локальную дату не используется желаемый век

Я использую этот 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?

Спасибо за вашу помощь


person Happy    schedule 07.04.2015    source источник


Ответы (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. Что касается того факта, что у вас нет других полей, связанных с неделей, я бы предположил, что это обычный календарный год, а не недельный.

person Meno Hochschild    schedule 07.04.2015