Формат 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);
Другие вопросы по тегам