Как проанализировать только четырехзначный год (с помощью Joda Time)?

StackOverflow https://stackoverflow.com/questions/1612150

  •  05-07-2019
  •  | 
  •  

Вопрос

Есть ли способ заставить время Джоды анализировать даты только тогда, когда они содержат четырехзначные годы?Например:

  • 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top