Java8- ZonedDateTime,DateTimeFormatter无法识别格式

时间:2016-01-25 23:01:35

标签: java-8 java-time zoneddatetime

我正在使用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解析为1970-01-01T00:00,类型为java.time.format.Parsed

2 个答案:

答案 0 :(得分:10)

好吧,你想要创建一个总是引用时区的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
    

答案 1 :(得分: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方法将时区添加到另一个日期/时间对象。