ISO8601日期解析忽略偏移量

时间:2019-06-14 11:30:27

标签: java date java.time

我正在尝试使用2009-07-30T16:10:36+06:00yyyy-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 个答案:

答案 0 :(得分:2)

如果我的理解正确,则应将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 :(得分:1)

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)。

答案 2 :(得分:0)

如果您希望使用UTC时间(问题尚不清楚),则其他答案将为您提供正确的结果。由于您的数据中没有时区(例如欧洲/伦敦太平洋/拉罗通加),因此使用\是没有意义的。 ZonedDateTime比较合适:

OffsetDateTime
  

2009年7月30日10:10:36