Синтаксический анализ даты ISO8601 игнорирует смещение

Я пытаюсь разобрать 2009-07-30T16:10:36+06:00 на дату, используя yyyy-MM-dd'T'HH:mm:ssXXXXX.

Однако результат, который я получаю, похоже, не учитывает смещение, поскольку я получаю yyyy-MM-dd'T'HH:mm:ssXXXXX.

Любые идеи, что мне не хватает?

final DateTimeFormatter iso8601Formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXXXX");
final ZonedDateTime zonedDateTime = ZonedDateTime.parse("2009-07-30T16:10:36+06:00", iso8601Formatter);
final String formatted = zonedDateTime.format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"));
System.out.println(formatted);

Вам не нужно определять свои собственные DateTimeFormatter для дат ISO-8601. Вместо этого используйте предопределенные DateTimeFormatter.ISO_OFFSET_DATE_TIME или ISO_ZONED_DATE_TIME.

Jesper 14.06.2019 13:38

Ваш код выводит 30/07/2009 16:10:36 для меня, что кажется правильным. Какое значение вы ожидаете?

TiiJ7 14.06.2019 13:45

@TiiJ7, независимо от того, какое смещение установлено, дата печатается одинаково.

Jakg 14.06.2019 13:58

@Jesper да, я знаю об этом, но это был минимизированный пример моей проблемы.

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

Ответы 3

OffsetDateTime odt = OffsetDateTime.parse("2009-07-30T16:10:36+06:00");
ZonedDateTime zdt = ZonedDateTime.ofInstant(odt.toInstant(), ZoneOffset.UTC);
// 2009-07-30T10:10:36Z

Во-первых, у вас нет зонированного времени даты, которое также зависело бы от страны.

Тогда на самом деле вам нужно время по Гринвичу, UTC.

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

Если я правильно понимаю, вы должны установить zone аналогично withZoneSameInstant(ZoneId.of("UTC"))

final ZonedDateTime zonedDateTime = ZonedDateTime.parse("2009-07-30T16:10:36+06:00", DateTimeFormatter.ISO_OFFSET_DATE_TIME);

System.out.println("Without ZoneId: " + zonedDateTime.format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss")));
System.out.println("With ZoneId:    " + zonedDateTime.withZoneSameInstant(ZoneOffset.UTC).format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss")));

Результат

Without ZoneId: 30/07/2009 16:10:36
With ZoneId:    30/07/2009 10:10:36

Если вам нужно время в формате UTC (что неясно из вопроса), то другие ответы дают правильный результат. Поскольку в ваших данных нет часового пояса (например, Europe/London Pacific/Rarotonga), нет смысла использовать ZonedDateTime. OffsetDateTime лучше подходит:

    final OffsetDateTime dateTime = OffsetDateTime.parse("2009-07-30T16:10:36+06:00");
    final OffsetDateTime utcDateTime = dateTime.withOffsetSameInstant(ZoneOffset.UTC);
    final String formatted = utcDateTime.format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"));
    System.out.println(formatted);

30/07/2009 10:10:36

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

Похожие вопросы

Ни BindingResult, ни простой целевой объект для имени bean-компонента «bookDto» не доступны в качестве атрибута запроса
Потоки в Java намного медленнее, чем родной цикл for - почему?
Создание файла JSON с использованием для каждого цикла и карты. Повторяет значение первого элемента на всех итерациях цикла for
Любые идеи, как сделать мой код эффективным для циклов 10 000 000 000 раз
Есть ли несколько способов установить значение bean-компонента и сохранить их в базе данных с помощью PersistentObject?
Как разрешить анонимный доступ пользователей с локального хоста только в безопасности Spring?
Не может конвертировать из ChromeDriver в WebDriver в веб-драйвере selenium с java, как это преодолеть?
Получено событие сбоя для теста с неизвестным идентификатором «5.14». Зарегистрированные идентификаторы тестов: '[:my.project:test, 5.1]'
Spark не может найти зависимости
Как добавить библиотеку stanford corenlp в Eclipse/Netbeans IDE для проекта Java NLP?