Я пытаюсь разобрать 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);
Ваш код выводит 30/07/2009 16:10:36 для меня, что кажется правильным. Какое значение вы ожидаете?
@TiiJ7, независимо от того, какое смещение установлено, дата печатается одинаково.
@Jesper да, я знаю об этом, но это был минимизированный пример моей проблемы.




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