当我这样做时
String datum = "20130419233512";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.of("Europe/Berlin"));
OffsetDateTime datetime = OffsetDateTime.parse(datum, formatter);
我得到以下异常:
java.time.format.DateTimeParseException: Text '20130419233512' could not be parsed:
Unable to obtain OffsetDateTime from TemporalAccessor: {InstantSeconds=1366407312},ISO,Europe/Berlin resolved
to 2013-04-19T23:35:12 of type java.time.format.Parsed
如何解析我的日期时间字符串,以便将其解释为始终来自时区“欧洲/柏林”?
问题是,两者之间存在差异。ZoneId
是和一个ZoneOffset
是。创建一个OffsetDateTime
,您需要一个区域偏移。但之间不存在一对一的映射ZoneId and a ZoneOffset https://stackoverflow.com/q/32626733/1743880因为这实际上取决于当前的夏令时。对于相同的ZoneId
与“欧洲/柏林”一样,夏季有一个偏移量,冬季有不同的偏移量。
对于这种情况,使用ZonedDateTime
而不是OffsetDateTime
。在解析过程中,ZonedDateTime
将被正确设置为"Europe/Berlin"
区域 id 和偏移量也将根据要解析的日期有效的夏令时进行设置:
public static void main(String[] args) {
String datum = "20130419233512";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.of("Europe/Berlin"));
ZonedDateTime datetime = ZonedDateTime.parse(datum, formatter);
System.out.println(datetime.getZone()); // prints "Europe/Berlin"
System.out.println(datetime.getOffset()); // prints "+02:00" (for this time of year)
}
请注意,如果您确实想要OffsetDateTime
, 您可以使用ZonedDateTime.toOffsetDateTime() https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html#toOffsetDateTime--转换一个ZonedDateTime
进入一个OffsetDateTime
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)