Я использую JSR 310 DateTime API * в своем приложении, и мне нужно анализировать и форматировать военные даты (известные как DTG или "дата-группа времени" ).
Формат, который я обрабатываю, выглядит так (используя DateTimeFormatter
):
"ddHHmm'Z' MMM yy" // (ie. "312359Z DEC 14", for new years eve 2014)
Этот формат довольно легко разобрать, как описано выше. Проблема возникает, когда даты содержат другой часовой пояс, чем "Z" (часовой пояс Zulu, то же, что и UTC/GMT), например "A" (Alpha, UTC + 1: 00) или "B" (Bravo, UTC + 2:00). См. Военные часовые пояса для полного списка.
Как я могу разобрать эти часовые пояса? Или, другими словами, что я могу добавить в формат выше, чем буквальный "Z" , чтобы правильно разобрать все зоны? Я пробовал использовать "ddHHmmX MMM yy"
, "ddHHmmZ MMM yy"
и "ddHHmmVV MMM yy"
, но никто из них не работает (все будут бросать DateTimeParseException: Text '312359A DEC 14' could not be parsed at index 6
для примера выше, при разборе). Использование одного V
в формате не допускается (IllegalArgumentException
при попытке создать экземпляр DateTimeFormatter
).
Изменить: Кажется, что символ z
мог бы сработать, если бы не проблема ниже.
Я также должен отметить, что я создал ZoneRulesProvider
со всеми названными зонами и правильным смещением. Я проверил, что они правильно зарегистрированы с использованием механизма SPI, и мой метод provideZoneIds()
вызывается, как ожидалось. Еще не разобратся. Как побочная проблема (Edit: теперь это, по-видимому, главная проблема), API-интерфейсы идентификаторов часовых поясов одиночного символа (или "регионов" ), кроме "Z" , не допускаются.
Например:
ZoneId alpha = ZoneId.of("A"); // boom
Бросит DateTimeException: Invalid zone: A
(даже не получив доступ к моему провайдеру правил, чтобы узнать, существует ли он).
Является ли это надзором в API? Или я делаю что-то неправильно?
*) На самом деле, я использую Java 7 и ThreeTen Backport, но я не думаю, что это важно для этого вопроса.
PS: Моим текущим обходным путем является использование 25 различных DateTimeFormatter
с литеральным идентификатором зоны (т.е. "ddHHmm'A' MMM yy"
, "ddHHmm'B' MMM yy"
и т.д.), используйте RegExp
для извлечения идентификатора зоны и делегирования правильному форматирование на основе зоны. Идентификаторы зоны в провайдере называются "Альфа", "Браво" и т.д., Чтобы позволить ZoneId.of(...)
находить зоны. Оно работает. Но это не очень элегантно, и я надеюсь, что там будет лучшее решение.