Java 8 Java8-带DateTimeFormatter的ZonedDateTime无法识别该格式

Java 8 Java8-带DateTimeFormatter的ZonedDateTime无法识别该格式,java-8,java-time,zoneddatetime,Java 8,Java Time,Zoneddatetime,我正在使用Java8的ZonedDateTime和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(oraceD

我正在使用Java8的ZonedDateTime和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

好吧,您想创建一个
ZonedDateTime
,它总是指向一个时区,但您的输入不包含这样的信息,如果输入缺少时区,您也没有指示格式化程序使用默认时区。您的问题有两种解决方案:

  • 指示解析器使用时区(此处以system 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]
    
    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
    
  • 使用另一种不需要时区的结果类型(此处
    LocalDateTime

    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]
    
    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
    

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

    谢谢Meno。我选择选项1,因为我需要传递时区。创建并传递给ZoneId对象。ZoneId ZoneId=ZoneId.of(ZoneId.SHORT_id.get(“CST”));