我有一个数据输入流,其中包含格式为" 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标签中的类似问题,但无法找到问题的解决方案。
答案 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-day
为H
,或者只使用{{1} }}