DateTimeFormatterBuilder # appendText (TemporalField, Map<Long, String>) выдает исключение при разборе

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

Проблемный текст: "20 октября 2018 года, второй квартал". Квартальное значение ("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 октября 2018 Q2 "не может быть проанализирован с индексом 0"

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

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

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

1 ответ

Решение

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

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

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