2016-07-13 1 views
3

Следующий тест не выполнен: '86 День рождения формируется как 2068. Как я могу форматировать как 1986?Как заставить java.time.LocalDate принять 19-ое столетие как образец года YY?

@Test 
    public void testBirthday() { 
     assertEquals("1986-08-07", java.time.LocalDate.parse("070886", 
      java.time.format.DateTimeFormatter.ofPattern("ddMMyy"))); 
    } 

завершается с:

java.lang.AssertionError: expected:<1986-08-07> but was:<2086-08-07> 

Это сильно отличается от org.joda.time библиотеки, которая будет правильно считать 19' здесь.

/Sidenote: относительно отмеченных ответов в «повторяющихся» вопросах, я не думаю, что это дубликат!

+1

шуточного Ответ заключается в использовании 'org.joda.time'. – Bathsheba

+2

Нет, это не так. 'joda' фактически« устарел »и больше не развивается. По крайней мере, сами авторы предлагают перейти на java8 'java.time' в настоящее время. – membersound

+1

Просто отметим, что это документированное поведение: «Если количество букв равно двум, то используется уменьшенная двузначная форма. Для печати это выводит самые правые две цифры. Для синтаксического анализа это будет анализироваться с использованием базового значения 2000, в результате чего в течение года в пределах от 2000 до 2099 включительно ». К сожалению, он не говорит, как * изменить * это поведение. Возможно, вы сможете указать отдельный ResolverField, но он немного надуман. Вам может показаться проще просто «исправить» строку вручную, чтобы использовать четырехзначный год. –

ответ

3

Базовый год можно контролировать, используя DateTimeFormatterBuilder.appendValueReduced().

Этот код будет анализировать с базовой датой 1900 года, а не 2000:

DateTimeFormatter f = new DateTimeFormatterBuilder() 
    .appendPattern("ddMM") 
    .appendValueReduced(ChronoField.YEAR, 2, 2, 1900) 
    .toFormatter(); 
LocalDate date = LocalDate.parse("070886") 
-1

Класс Java 8's LocalDate использует 2000+ по году по умолчанию. Чтобы разобрать формат yy на 1900 и выше, вам нужно сократить время самостоятельно.

Конечно, даже если вы проверите дату по сравнению с текущим годом и вычтите 100 лет, если после сегодняшнего дня это исправление не будет работать для людей старше 100 лет.

Вы также можете использовать формат yyyy. Или просто используйте объект Date и конвертируйте его в LocalDate, если хотите.