У меня возникли проблемы с реализацией «простого» синтаксического анализа даты. Требование состоит в том, чтобы разрешить ввод года на две или четыре цифры. Когда вводятся две цифры, введите дату окончания для принятия решения о том, в каком веке оно относится к первому января следующего года. Вот что у меня есть до сих пор:Дата синтаксиса по нескольким форматам с установкой 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
У меня аналогичная проблема, но ваше решение не кажется, работает для меня, как ни странно. Мне пришлось открыть новый вопрос об этом http://stackoverflow.com/questions/19143817/joda-time-parsing-two-digit-year-correctly-based-on-pivot – Neeko