Java 错误:";无法从TemporalAccessor“获取ZonedDateTime”;对于“格式”;yyyy MM dd hh:MM:ss z“;

Java 错误:";无法从TemporalAccessor“获取ZonedDateTime”;对于“格式”;yyyy MM dd hh:MM:ss z“;,java,zoneddatetime,Java,Zoneddatetime,我有一个数据输入流,其中包含格式为“yyyy-MM-dd hh:MM:ss z”的日期,在进一步传播日期时需要保留时区。 下面是测试程序(带有错误堆栈)-我的解决方案有什么问题 public class Test { public static void main(String[] args) { try { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss z");

我有一个数据输入流,其中包含格式为“yyyy-MM-dd hh:MM:ss z”的日期,在进一步传播日期时需要保留时区。 下面是测试程序(带有错误堆栈)-我的解决方案有什么问题

public class Test {

public static void main(String[] args) {
    try {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss z");
        ZonedDateTime zdt = ZonedDateTime.parse("2016-12-09 09:30:21 UTC", dtf);
        System.out.println(zdt);
    } catch (Exception e) {
        System.err.println("Exception in 1st approach: " + e.getMessage());
    }

    try {
        DateTimeFormatter dtf = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd hh:mm:ss z").toFormatter();
        ZonedDateTime zdt = ZonedDateTime.parse("2016-12-09 09:30:21 UTC", dtf);
        System.out.println(zdt);
    } catch (Exception e) {
        System.err.println("Exception in 2nd approach: " + e.getMessage());
    }
  }
}
输出(异常消息):

第1种进近中的例外情况:无法输入文本“2016-12-09 09:30:21 UTC” 已解析:无法从临时Accessor获取ZonedDateTime: {HourOfAmPm=9,分小时=30,微秒=0,秒分钟=21, 毫微秒=0,毫微秒=0},ISO,UTC解析为2016年12月9日 键入java.time.format.Parsed

第二种方法中的例外情况:无法输入文本“2016-12-09 09:30:21 UTC” 已解析:无法从临时Accessor获取ZonedDateTime: {HourOfAmPm=9,分小时=30,微秒=0,秒分钟=21, 毫微秒=0,毫微秒=0},ISO,UTC解析为2016年12月9日 键入java.time.format.Parsed

JDK版本1.8.0_111

我已经阅读了ZoneDateTime标签中的类似问题,但找不到解决问题的方法。

您应该使用
DateTimeFormatter dtf=DateTimeFormatter.of模式(“yyyy-MM-dd-HH:MM:ss z”)而不是使用

  DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss z");

因此,模式中的
h
必须是
h
。根据
h
在定义
am-pm的时钟小时时使用
h
,因此,除此之外,您还应该在您的父亲中使用
a
作为
am-pm
,或者只使用
h

而不使用hh,您必须使用大写字母hh,明白了-非常感谢您发现了这一点!显然,java.time.*对格式要求更严格(这很好)。