Как исправить org.threeten.bp.format.DateTimeParseException? - PullRequest
0 голосов
/ 17 октября 2018

Я конвертирую время UTC в местное время и сталкиваюсь с ошибкой:

org.threeten.bp.format.DateTimeParseException: Text 'Ср. 17 октября 06:12:19 GMT + 05:30 2018 'не удалось проанализировать по индексу 20

Скажите, пожалуйста, какие-либо другие варианты или исправьте это решение ..

Это мой код, проверьте его:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
    String formattedDate = LocalDateTime.parse(UTC_time, formatter)
            .atOffset(ZoneOffset.UTC)
            .atZoneSameInstant(ZoneId.systemDefault())
            .format(formatter);

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Во-первых, кажется, что ваша строка может быть вызвана вызовом 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 включая шаблон формата букв

0 голосов
/ 17 октября 2018

Используйте это

DateTimeFormatter formatter = 
       DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);

Вы можете использовать эту ссылку , чтобы найти свой шаблон

...