Во-первых, кажется, что ваша строка может быть вызвана вызовом toString
для старомодного объекта java.util.Date
.Если это так, вы можете посмотреть, сможете ли вы ухватиться за сам объект Date
и преобразовать его, используя DateTimeUtils
(из ThreeTenABP), и избавить от всех проблем при разборе.
Во-вторых, ваш код работаетсо встроенным java.time на моем настольном компьютере, и я не знаю, почему он не работает с backport.Возможное исправление для обратного порта:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss OOOO yyyy", Locale.ENGLISH);
String inputString = "Wed Oct 17 06:12:19 GMT+05:30 2018";
String formattedDate = OffsetDateTime.parse(inputString, formatter)
.atZoneSameInstant(ZoneId.systemDefault())
.format(formatter);
System.out.println(formattedDate);
На моем компьютере в часовом поясе Европы / Копенгагена это выводит:
Ср. 17 октября 02:42:19 GMT + 02:00 2018
РЕДАКТИРОВАТЬ: Хотя не подтверждено документально, что бэкпорт поддерживает шаблонную букву формата O
, вышеописанное работает на ThreeTen Backport 1.3.6 намой Mac.Документированной альтернативой является следующий вариант шаблона формата:
DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss 'GMT'xxx yyyy", Locale.ROOT);
Если вы предпочитаете сокращение часового пояса, например CEST
, по сравнению со смещением по Гринвичу, вы можете использовать исходный форматер для форматирования обратно в строку.Хитрость в том, что OOOO
в шаблоне формата анализирует GMT+05:30
и этот стиль смещения по Гринвичу или UTC в целом.
Я исправил еще одну ошибку в вашем коде: когда вы анализировали в LocalDateTime
Вы потеряли информацию о часовом поясе или смещении из строки, что привело к неправильному времени.В частности, когда в строке было GMT+05:30
, а вы сделали .atOffset(ZoneOffset.UTC)
, время было выключено на 5 часов 30 минут.Вместо этого используйте OffsetDateTime
для синтаксического анализа (если бы z
для имени зоны работало, вам бы понадобилось ZonedDateTime
).
Ссылка: Документация org.threeten.bp:format.DateTimeFormatter
включая шаблон формата букв