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

Я использую этот параметр 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 года?

Спасибо за помощь

8
задан Happy 07 апр. '15 в 14:49
источник поделиться
1 ответ

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

12
ответ дан Meno Hochschild 07 апр. '15 в 19:10
источник поделиться

Другие вопросы по меткам или Задайте вопрос