Как разобрать только четырехзначный год (с Joda Time)? - PullRequest
4 голосов
/ 23 октября 2009

Можно ли заставить Joda анализировать даты только в том случае, если они содержат четыре цифры года? Например:

  • 2009-11-11 - должен разобрать
  • 09-11-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 в методе appendYear используются только для форматирования при печати даты.
Результат тот же, если я использую appendYearOfEra (). Если я использую appendYearOfCentury (), вместо этого он анализирует год на 1909.

Мы реализуем общий анализатор данных, который распознает различные типы входных данных. Также пример - сокращенная форма реальной сделки (для простоты). Сценарии реальной жизни анализируют даты, которые могут содержать дни недели, месяцы в виде слов, время, зону и различные символы, разделяющие месяц, день и год. Поэтому написание RegEx или проверка содержимого / длины строки может оказаться довольно сложной задачей.

Некоторые реальные примеры могут выглядеть так:

  • 2009-11-11
  • среда 2009-11-11T15: 00: 00
  • 2009/11/11 15: 00
  • и многие другие ...

Ответы [ 4 ]

7 голосов
/ 11 ноября 2009

DateTimeFormatterBuilder.appendFixedDecimal () вполне может сделать то, что вам нужно.

В качестве альтернативы, вы можете реализовать интерфейс DateTimeParser, чтобы создать любой синтаксический анализатор и передать его в DateTimeFormatterBuilder.

1 голос
/ 23 октября 2009

Вы можете проверить длину строки даты.

1 голос
/ 23 октября 2009

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

0 голосов
/ 29 октября 2009

Что вы хотите получить от пользователя, который вводит «0001-01-01» в качестве даты (то есть они вводят 4 цифры за год, но первые три были нулями)? А как насчет 0999-12-31? И «999-12-31»? А как насчет «10000-01-01» - печально известная проблема Y10K 1 ?

  • Если это допустимое значение, то вы застряли с обнаружением длины того, что пользователь ввел в качестве годовой части даты (вероятно, после любого другого анализа), и убедитесь, что оно установлено минимум (или это точно?) четыре цифры.

  • Если это недопустимое значение, то вы застряли с проверкой значения года после разбора даты.

  • Или вы можете взять код и изменить его так, чтобы он включал ваше предпочтительное определение действительного года.


1 Я не планирую начинать работу по устранению проблемы Y10K до 5000-01-02.

...