错误:"无法从TemporalAccessor获取ZonedDateTime"格式" yyyy-MM-dd hh:mm:ss z"

时间:2016-12-09 08:24:31

标签: java zoneddatetime

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

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());
    }
  }
}
  

输出(例外消息):

     

第一种方法的例外:文字' 2016-12-09 09:30:21 UTC'不可能   解析:无法从TemporalAccessor获取ZonedDateTime:   {HourOfAmPm = 9,MinuteOfHour = 30,MicroOfSecond = 0,SecondOfMinute = 21,   NanoOfSecond = 0,MilliOfSecond = 0},ISO,UTC解析为2016-12-09   输入java.time.format.Parsed

     

第二种方法中的例外情况:文字' 2016-12-09 09:30:21 UTC'不可能   解析:无法从TemporalAccessor获取ZonedDateTime:   {HourOfAmPm = 9,MinuteOfHour = 30,MicroOfSecond = 0,SecondOfMinute = 21,   NanoOfSecond = 0,MilliOfSecond = 0},ISO,UTC解析为2016-12-09   输入java.time.format.Parsed

JDK版本1.8.0_111

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

1 个答案:

答案 0 :(得分:2)

你应该使用 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");而非使用

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

因此,您的模式中的h必须为H。根据{{​​3}} h,您可以在定义clock-hour-of-am-pm时使用a,因此您的patern中也应该am-pm-of-dayH,或者只使用{{1} }}