asm*_*ier 13 java java-8 java-time
当我这样做
String datum = "20130419233512";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.of("Europe/Berlin"));
OffsetDateTime datetime = OffsetDateTime.parse(datum, formatter);
Run Code Online (Sandbox Code Playgroud)
我得到以下异常:
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
Run Code Online (Sandbox Code Playgroud)
如何解析我的日期时间字符串,以便将其解释为始终来自"Europe/Berlin"时区?
Tun*_*aki 16
问题是a ZoneId和a 之间存在差异ZoneOffset.要创建一个OffsetDateTime,您需要一个区域偏移.但是a ZoneId和a 之间没有一对一的映射,ZoneOffset因为它实际上取决于当前的夏令时.出于同样ZoneId喜欢"欧洲/柏林",有一个夏天偏移和冬季不同的偏移.
对于这种情况,使用a ZonedDateTime而不是a更容易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)
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果您真的需要OffsetDateTime,可以使用ZonedDateTime.toOffsetDateTime()将其ZonedDateTime转换为OffsetDateTime.
源数据中没有偏移量,因此OffsetDateTime不是在解析过程中使用的正确类型。
相反,请使用LocalDateTime,因为这是最类似于您所拥有数据的类型。然后使用atZone为其分配时区,如果仍然需要OffsetDateTime,则可以toOffsetDateTime从那里进行呼叫。
String datum = "20130419233512";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
LocalDateTime datetime = LocalDateTime.parse(datum, formatter);
ZonedDateTime zoned = datetime.atZone(ZoneId.of("Europe/Berlin"));
OffsetDateTime result = zoned.toOffsetDateTime();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8367 次 |
| 最近记录: |