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)
(и не имеет информации о ваших специальных помещениях).