Преобразовать строку в ZonedDateTime и изменить TimeZone

У меня есть эта строка "Tue Apr 09 2019 12:59:51 GMT+0300"

Я хочу преобразовать в ZonedDateTime.

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMM dd yyyy HH:mm:ss OOOO");
ZonedDateTime zdt = ZonedDateTime.parse(a, dtf);

После преобразования в ZonedDateTime я хочу изменить часовой пояс с GMT+0300 на другой часовой пояс.

Моя первая проблема в parse. Я получил:

DateTimeParseException: Text 'Tue Apr 09 2019 12:59:51 GMT+0300' could not be parsed at index 25 (в GMT+0300 я думаю OOOO это неправильно, но я не знаю, что еще это такое)

После этого я не знаю, как изменить часовой пояс.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
635
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

OOOO ожидает двоеточие перед минутным полем, как говорит документ:

Four letters outputs the full form, which is localized offset text, such as 'GMT, with 2-digit hour and minute field, optional second field if non-zero, and colon, for example 'GMT+08:00'.

Вы можете программно вставить : перед последним 00, а затем проанализировать его.

Вставил : и теперь могу разобрать. Спасибо! Но я до сих пор не знаю, как изменить часовой пояс.

KunLun 09.04.2019 17:19

@KunLun назовите этот метод withZoneSameInstant. docs.oracle.com/javase/8/docs/api/java/time/…

xingbin 09.04.2019 17:21

Поскольку ваша строка содержит смещение и не содержит часовой пояс, для чего вам нужен ZonedDateTime? OffsetDateTime больше подходит.

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern(
            "EEE MMM dd yyyy HH:mm:ss 'GMT'xx", Locale.ROOT);
    String a = "Tue Apr 09 2019 12:59:51 GMT+0300";
    System.out.println(OffsetDateTime.parse(a, dtf));

2019-04-09T12:59:51+03:00

Часовой пояс — это место на земле, которое охватывает исторические и известные будущие изменения смещения UTC в этом месте. Часовой пояс обычно указывается в формате область / город, например, Азия/Рангун.

Редактировать

I use ZonedDateTime because I use time zone in my app.

Я не уверен, что именно вы имеете в виду. Может быть, вы заранее решили, какой часовой пояс вы используете? Например:

    ZoneId zone = ZoneId.of("Europe/Zaporozhye");
    OffsetDateTime odt = OffsetDateTime.parse(a, dtf);
    ZonedDateTime zdt = odt.atZoneSameInstant(zone);
    System.out.println(zdt);

2019-04-09T12:59:51+03:00[Europe/Zaporozhye]

Если по какой-то причине вы хотите рассматривать GMT+0300 как часовой пояс, даже если это не так, синтаксический анализ, который я показал первым, работает и с ZonedDateTime:

    System.out.println(ZonedDateTime.parse(a, dtf));

2019-04-09T12:59:51+03:00

Я использую ZonedDateTime, потому что использую часовой пояс в своем приложении.

KunLun 09.04.2019 18:51

Другие вопросы по теме