Конвертировать строку в ZonedDateTime и изменить TimeZone - PullRequest
1 голос
/ 09 апреля 2019

У меня есть эта строка "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 это не правильно, но я не знаю, что еще это)

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

Ответы [ 2 ]

5 голосов
/ 09 апреля 2019

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

Четыре буквы выводят полную форму, которая является локализованным смещением текста, например, «GMT», с двухзначным полем часа и минуты, необязательное значение поле, отличное от нуля, и двоеточие, например, GMT + 08: 00.

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

2 голосов
/ 09 апреля 2019

Поскольку ваша строка содержит смещение, а часовой пояс отсутствует, для чего вам нужен 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 в этом месте. Часовой пояс обычно задается в формате регион / город , например Азия / Рангун.

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

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

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

    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 [Европа / Запорожье]

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

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

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

...