Как проанализировать только четырехзначный год (с помощью Joda Time)?
Вопрос
Есть ли способ заставить время Джоды анализировать даты только тогда, когда они содержат четырехзначные годы?Например:
- 11.11.2009 - надо разобрать
- 11.09.11 - не стоит разбирать
Попробовал следующий код:
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
DateTimeFormatter formatter = builder.appendYear(4, 4).appendLiteral('-').appendMonthOfYear(1).appendLiteral('-').appendDayOfMonth(1).toFormatter();
formatter.parseDateTime("09-11-11");
Анализирует 0009-11-11.Очевидно, minDigits в методе addYear используются только для форматирования при распечатке даты.
Результат будет тот же, если я использую метод AppendYearOfEra().Если я использую addYearOfCentury(), вместо этого он анализирует год в 1909.
Мы реализуем общий анализатор данных, который распознает различные типы входных данных.Также пример представляет собой сокращенную форму реальной сделки (для простоты).В реальных сценариях анализируются даты, которые могут содержать дни недели, месяцы в виде слов, время, зону и различные символы, разделяющие месяц, день и год.Поэтому написание RegEx или проверка содержимого/длины строки может оказаться довольно сложной задачей.
Некоторые реальные примеры могут выглядеть так:
- 2009-11-11
- Среда 2009-11-11T15:00:00
- 2009/11/11 15:00
- и многое другое...
Решение
DateTimeFormatterBuilder.appendFixedDecimal() вполне может сделать то, что вам нужно.
В качестве альтернативы вы можете реализовать интерфейс DateTimeParser, чтобы создать любой анализатор, который вам нужен, и передать его в DateTimeFormatterBuilder.
Другие советы
Вы можете проверить длину строки даты.
Вы можете создавать чрезвычайно специфичные парсеры и форматтеры, используя ДатаВремяФорматтерБилдер.Обычно нет необходимости использовать этот класс напрямую, поскольку большинство распространенных форматов более легко доступны в других местах API, но все они используют этот класс компоновщика под прикрытием.
Что вы хотите получить от пользователя, который вводит в качестве даты «0001-01-01» (то есть он ввел 4 цифры года, но первые три были нулями)?А как насчет «0999-12-31»?А «999-12-31»?А как насчет «10000-01-01» — пресловутого 10 тысяч иен1 проблема?
Если это допустимое значение, то вам придется выяснить длину того, что пользователь ввел в качестве года даты (вероятно, после того, как был выполнен любой другой синтаксический анализ), и убедиться, что она по крайней мере (или это именно так) ?) четыре цифры.
Если это недопустимое значение, вам придется проверять значение года после анализа даты.
Или вы можете взять код и изменить его, чтобы он включал предпочитаемое вами определение действительного года.
1 Я не планирую начинать работу по устранению проблемы Y10K до 02.01.5000.