Формат ZonedDateTime и исключение синтаксического анализа с «z» в шаблоне формата
у меня проблема с разбором
ZonedDateTime
:
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-ddzhh:mm");
ZonedDateTime.parse(s, formatter);
Это приводит к ошибке:
java.time.format.DateTimeParseException:
Text '2022-05-24UTC12:15' could not be parsed at index 10
что не так с этим кодом?
2 ответа
Персонаж должен уметь анализировать
"UTC"
(в большинстве s), потому что UTC считается идентификатором часового пояса и именем часового пояса в
java.time
. A может анализировать идентификаторы часовых поясов , а может анализировать имена часовых поясов в соответствии с JavaDocs
java.time.DateTimeFormatter
, вот соответствующая часть документов:
Symbol Meaning Presentation Examples
------ ------- ------------ -------
(…)
V time-zone ID zone-id America/Los_Angeles; Z; -08:30
z time-zone name zone-name Pacific Standard Time; PST
(…)
Это означает, что вы можете разобрать его, используя символ
V
без предоставления конкретного для вашего . Вам придется поставить два из них (
VV
) или вы получите хороший
IllegalArgumentException
со следующим сообщением:
java.lang.IllegalArgumentException: Pattern letter count must be 2: V
Если вы все еще хотите использовать
z
, предоставьте a, который считает аббревиатуру универсального координированного времени , центральноевропейское летнее время — это аббревиатура, которая определенно меняется в зависимости от разных часов, например
- Английский:
CEST
- Немецкий:
MESZ
Другие s могут иметь другие сокращения, что заставляет меня задаться вопросом, действительно ли у вас есть другое сокращение для
UTC
.
Предоставлять
Locale.ENGLISH
, например, и он должен быть успешно проанализирован.
Вы должны предоставить его в любом случае, потому что, если вы этого не сделаете,
DateTimeFormatter
будет неявно использовать значение по умолчанию
Locale
вашей (виртуальной Java) машины.
Итак, вы можете попробовать это:
DateTimeFormatter format = DateTimeFormatter.ofPattern("uuuu-MM-ddVVHH:mm");
или это:
DateTimeFormatter format = DateTimeFormatter.ofPattern("uuuu-MM-ddzHH:mm", Locale.ENGLISH);
оба должны иметь возможность анализировать ввод, например
"2022-05-24UTC12:15"
если вы используете вместо часов дня (
hh
= 12-часовой формат,
HH
= 24-часовой формат).
Да, это из-за шаблона форматирования, я предлагаю использовать код ниже:
final DateTimeFormatter format
= DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
ZonedDateTime zonedDateTime = ZonedDateTime
.parse("2022-05-24 14:30:30 -01:00", format);
System.out.println(zonedDateTime);
ZonedDateTime localTimeline = zonedDateTime
.withZoneSameInstant(ZoneId.systemDefault());
// for the local timezone
System.out.println(localTimeline);