有一些选择。
首先,正如您所说,在区域偏移中插入冒号并不难。完成后,获得 aZonedDateTime
很简单:
ZonedDateTime zdt = ZonedDateTime.parse("2017-01-11T09:38:41+01:00");
System.out.println(zdt);
这打印:
2017-01-11T09:38:41+01:00
或者,有趣的是,虽然ZonedDateTime.parse(String)
在偏移量中需要一个冒号,ZoneId.of()
但不需要,因此您可以拆分偏移量并执行以下操作:
ZoneId zi = ZoneId.of("+0100");
LocalDateTime ldt = LocalDateTime.parse("2017-01-11T09:38:41");
ZonedDateTime zdt = ldt.atZone(zi);
结果和以前一样。
如果您不想在解析之前修改您的字符串,还有:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ");
ZonedDateTime zdt = ZonedDateTime.parse("2017-01-11T09:38:41+0100", dtf);
这也给出了相同的结果。
编辑:注意:我正在使用ZonedDateTime
,因为你在你的问题中要求这个。您可能认为使用它更正确OffsetDateTime
。大多数代码实际上是相同的。拆分偏移量的版本将如下所示:
ZoneOffset zo = ZoneOffset.of("+0100");
LocalDateTime ldt = LocalDateTime.parse("2017-01-11T09:38:41");
OffsetDateTime odt = ldt.atOffset(zo);
如问题末尾所述,要转换为 UTC,ZoneOffset
请应用另一个 常量ZoneOffset.UTC
。
OffsetDateTime odtUtc = odt.withOffsetSameInstant( ZoneOffset.UTC );