DateTimeFormatterBuilder # appendText (TemporalField, Map) выдает исключение при разборе - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь проанализировать текст, представляющий значение LocalDate, с IsoField.QUARTER_OF_YEAR, используя DateTimeFormatter, возвращаемое методом DateTimeFormatterBuilder#buildFormatter().

Проблемный текст: «20 октября 2018 г., Q2».Квартальное значение («Q2»), по общему признанию, неверно для обычного календарного года, здесь «2018».Однако я работаю с финансовым годом, который заканчивается 30 июня, поэтому дата «20 октября 2018 года» будет во втором квартале финансового года.

Модуль форматирования построен со следующим кодом:

TemporalQuery<LocalDate> query = LocalDate::from;
String pattern = “d MMM uuuu qqq”;
Locale locale = Locale.forLanguageTag("en-US");
TemporalField tf = IsoFields.QUARTER_OF_YEAR;
Map<Long, String> m = new Hashtable<>();
m.put(4L, “Q2”);
DateTimeFormatter formatter = new DateTimeFormatterBuilder()                                                                                
                                       .parseCaseInsensitive()
                                       .appendPattern(pattern)
                                       .appendText(tf, m)
                                       .toFormatter(locale);
TemporalAccessor value = formatter.parse(text, query)

Попытки разобрать генерируют DateTimeParseException с сообщением об ошибке: «Текст '20 Oct 2018 Q2 'не может быть проанализирован с индексом 0»

Я пытался изменить порядок вкоторые вызываются parseCaseInsensitive()appendText().Исключение по-прежнему выдается, хотя указанный индекс равен 14 в одном из вариантов.

Возможная причина проблемы: метод DateTimeFormatterBuilder # appendText (TemporalField, Map) может работать только в операциях форматирования, но не для анализакак здесь.

Заранее спасибо за любые идеи или помощь!

1 Ответ

0 голосов
/ 21 октября 2018

Вы пытаетесь проанализировать часть квартала года дважды - один раз для инструкции шаблона (используя букву q) и один раз для инструкции построителя (используя метод appendText).Решение: Удалите qqq-часть в вашем шаблоне и используйте "d MMM uuuu" .

Однако некоторые замечания:

  • Финансовые годы вообще не поддерживаются.
  • Использовать лучше HashMap вместо устаревшего Hashtable.
  • Код примера имеет специальные кавычки вместо стандартного char (").
  • Анализируемое значениеэквивалентно LocalDate.of(2018, 10, 20) (и не имеет информации о ваших специальных помещениях).
...