2013-04-11 1 views
1

У меня возникли проблемы с реализацией «простого» синтаксического анализа даты. Требование состоит в том, чтобы разрешить ввод года на две или четыре цифры. Когда вводятся две цифры, введите дату окончания для принятия решения о том, в каком веке оно относится к первому января следующего года. Вот что у меня есть до сих пор:Дата синтаксиса по нескольким форматам с установкой pivotYear для двухзначных лет

DateTime now = new DateTime(); 
int pivotYear = now.getYear() - 49; // 2013 - 49 = 1964 where 49 is the 
DateTimeParser[] parsers = { 
    DateTimeFormat.forPattern("dd/MM/yy").withPivotYear(pivotYear).withLocale(new Locale("en", "NZ")).getParser(), 
    DateTimeFormat.forPattern("dd/MM/yyyy").withLocale(new Locale("en", "NZ")).getParser() 
}; 
DateTimeFormatter formatter = new DateTimeFormatterBuilder().append(null, parsers).toFormatter(); 
DateMidnight birthDate = new DateMidnight(formatter.parseDateTime(dateOfBirth)); 

К сожалению, это не делает то, что я ожидаю. Предположим, что на сегодняшний день (11/04/2013) и dateOfBirth = "01/01/14" он возвращает 2014-01-01T00:00:00.000+13:00. Ожидаемый результат будет 1914-01-01T00:00:00.000+13:00

Когда я смотрю на JavaDoc for the append method я вижу это предложение

принтера и анализатор интерфейсов низкоуровневой часть форматирования API. Обычно экземпляры извлекаются из другого форматирования . Однако обратите внимание, что любая форматная информация, такая как как локаль, временная зона, хронология, разбор парсерации или свод/по умолчанию года, не будет извлечена этим методом.

Так что я решил перенести Pivot вещи в DateTimeFormatterBuilder класс, так что теперь код выглядит следующим образом:

DateTimeParser[] parsers = { 
    DateTimeFormat.forPattern("dd/MM/yy").getParser(), 
    DateTimeFormat.forPattern("dd/MM/yyyy").getParser() 
}; 
DateTimeFormatter formatter = new DateTimeFormatterBuilder().append(null, parsers).appendTwoDigitYear(pivotYear).toFormatter().withLocale(new Locale("en", "NZ")); 

Unfortunatelly это не сортировка вопроса. Наоборот это не удается на этот раз на

java.lang.IllegalArgumentException: Invalid формат: "01/01/14" слишком коротка на org.joda.time.format.DateTimeFormatter.parseDateTime (DateTimeFormatter.java : 866)

из того же Javadoc я получаю это предложение

Дописывает принтер и набор соответствующих анализаторов. При разборе первый синтаксический анализатор в списке выбирается для синтаксического анализа. Если он терпит неудачу, выбирается следующий и т. Д. Если ни один из этих парсеров не завершится успешно, возвращается неудавшаяся позиция парсера, которая сделала наибольший прогресс.

Основываясь на этом, первый парсер должен получить задание, но похоже, что второй срабатывает, и он терпит неудачу, потому что он ожидает больше года.

Любая помощь будет глубоко оценена. Cheers Tomas

ответ

1

Так что, похоже, никто не заинтересован достаточно, чтобы ответить, поэтому я должен был это выяснить сам :-). Мне нужно прокручивать бит в JavaDoc, и я должен получить ответ в кратчайшие сроки. Существует еще один метод appendTwoDigitYear, который выполнит мою работу.

Так вот код, я использую сейчас

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendDayOfMonth(1).appendLiteral("/").appendMonthOfYear(1).appendLiteral("/").appendTwoDigitYear(pivotYear, true).toFormatter().withLocale(new Locale("en", "NZ")); 
DateMidnight birthDate = new DateMidnight(formatter.parseDateTime(dateOfBirth)); 

Надеется, что это поможет кому-то в будущем.

Приветствия Tomas

+0

У меня аналогичная проблема, но ваше решение не кажется, работает для меня, как ни странно. Мне пришлось открыть новый вопрос об этом http://stackoverflow.com/questions/19143817/joda-time-parsing-two-digit-year-correctly-based-on-pivot – Neeko