2

我有一个输入数据流,其中包含格式为“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());
    }
  }
}

输出(异常消息):

第一种方法中的异常:无法解析文本“2016-12-09 09:30:21 UTC”:无法从 TemporalAccessor 获取 ZonedDateTime:{HourOfAmPm=9, MinuteOfHour=30, MicroOfSecond=0, SecondOfMinute=21, NanoOfSecond= 0, MilliOfSecond=0},ISO,UTC 解析为 java.time.format.Parsed 类型的 2016-12-09

第二种方法中的异常:无法解析文本“2016-12-09 09:30:21 UTC”:无法从 TemporalAccessor 获取 ZonedDateTime:{HourOfAmPm=9, MinuteOfHour=30, MicroOfSecond=0, SecondOfMinute=21, NanoOfSecond= 0, MilliOfSecond=0},ISO,UTC 解析为 java.time.format.Parsed 类型的 2016-12-09

JDK 版本 1.8.0_111

我已阅读 zoneddatetime 标签中的类似问题,但找不到该问题的解决方案。

4

1 回答 1

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. 根据文档 h在您定义时使用clock-hour-of-am-pm ,此外您也应该aam-pm-of-day您的模式中使用或仅使用H

于 2016-12-09T08:36:20.960 回答