ISO8601 日期解析忽略偏移量
ISO8601 Date Parsing ignoring Offset
我正在尝试使用 yyyy-MM-dd'T'HH:mm:ssXXXXX
将 2009-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),因此没有必要使用 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
我正在尝试使用 yyyy-MM-dd'T'HH:mm:ssXXXXX
将 2009-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),因此没有必要使用 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