10

我将 ZonedDateTime 与 Java 8 的 DateTimeFormatter 一起使用。当我尝试解析自己的模式时,它无法识别并引发异常。

    String oraceDt = "1970-01-01 00:00:00.0";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
    ZonedDateTime dt = ZonedDateTime.parse(oraceDt, formatter);

Exception in thread "main" java.time.format.DateTimeParseException: Text '1970-01-01 00:00:00.0' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO resolved to 1970-01-01T00:00 of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
at com.timezone.Java8DsteTimes.testZonedDateTime(Java8DsteTimes.java:31)
at com.timezone.Java8DsteTimes.main(Java8DsteTimes.java:11)

原因:java.time.DateTimeException:无法从 TemporalAccessor 获取 ZonedDateTime:{},ISO 解析为 java.time.format.Parsed 类型的 1970-01-01T00:00

4

2 回答 2

23

好吧,您想创建一个ZonedDateTime始终引用时区,但您的输入不包含此类信息,并且如果输入缺少区域,您也没有指示格式化程序使用默认时区。您的问题有两种解决方案:

  1. 指示您的解析器使用时区(这里使用系统 tz 作为示例)

    String oraceDt = "1970-01-01 00:00:00.0";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
    ZonedDateTime zdt = 
      ZonedDateTime.parse(oraceDt, formatter.withZone(ZoneId.systemDefault()));
    System.out.println(zdt); // in my default zone => 1970-01-01T00:00+01:00[Europe/Berlin]
    
  2. 使用不需要时区的另一种结果类型(此处LocalDateTime

    String oraceDt = "1970-01-01 00:00:00.0";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
    LocalDateTime ldt = LocalDateTime.parse(oraceDt, formatter);
    System.out.println(ldt); // 1970-01-01T00:00
    
于 2016-01-26T01:46:47.683 回答
0

这是一个使用 ZonedDateTime 和 Java 8 的 DateTimeFormatter 的小例子。

public String currentDateTime() {

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("EEEE y-MM-d MMMM HH:m:s z Z'['VV']' 'Day:'D");

return ZonedDateTime.now(ZoneId.of("Europe/Lisbon")).format(dateTimeFormatter);
    }

ZonedDateTime 类允许您创建带有时区的日期/时间对象。将使用默认时区;即,您在计算机上建立的时区。您可以使用 DateTimeFormatter 类来显示时区。在 Java 代码中,时区显示为区域偏移量、区域名称和区域 ID。请注意,日期时间格式化程序模式分别为“Z”、“z”和“VV”。该程序还创建一个日期/时间对象,然后使用 ZoneId 类的 of 方法添加区域 ID。最后,使用 ZoneOffset 类的 of 方法将时区添加到另一个日期/时间对象。

于 2018-10-23T13:32:02.140 回答