У меня есть эта строка "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
это неправильно, но я не знаю, что еще это такое)
После этого я не знаю, как изменить часовой пояс.
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 назовите этот метод withZoneSameInstant
. docs.oracle.com/javase/8/docs/api/java/time/…
Поскольку ваша строка содержит смещение и не содержит часовой пояс, для чего вам нужен 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, потому что использую часовой пояс в своем приложении.
Вставил
:
и теперь могу разобрать. Спасибо! Но я до сих пор не знаю, как изменить часовой пояс.