ISO8601 Дата разбора игнорируя смещение - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь разобрать 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);

Ответы [ 3 ]

2 голосов
/ 14 июня 2019

Если мое понимание верно, вы должны установить 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
1 голос
/ 14 июня 2019
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.

0 голосов
/ 16 июня 2019

Если вы хотите, чтобы время в UTC (что не ясно из вопроса), то другие ответы дают вам правильный результат.Поскольку в ваших данных нет часового пояса (например, Европа / Лондон, Тихий океан / Раротонга), нет смысла использовать 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

...