Java8- ZonedDateTime,DateTimeFormatter无法识别格式

Ven*_*kat 2 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)
Run Code Online (Sandbox Code Playgroud)

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

Men*_*ild 14

好吧,你想要创建一个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]
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)