ISO8601 日期解析忽略偏移量

ISO8601 Date Parsing ignoring Offset

我正在尝试使用 yyyy-MM-dd'T'HH:mm:ssXXXXX2009-07-30T16:10:36+06:00 解析为日期。

但是我得到的输出似乎没有考虑偏移量,因为我得到 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);
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),因此没有必要使用 ZonedDateTimeOffsetDateTime 更合适:

    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