我有一段代码用于解析日期字符串 -
DateFormat cal = new SimpleDateFormat("yyyy-MM-dd hh:mm");
cal.setLenient(false);
try {
cal.parse("2018-01-01 14:42");
}
catch (Exception e)
{
e.printStackTrace();
}
}
但我得到一个例外 -
java.text.ParseException: Unparseable date: "2018-01-01 14:42"
at java.base/java.text.DateFormat.parse(DateFormat.java:388)
at MyClass.main(MyClass.java:10)
我不确定为什么我会看到此错误,因为日期字符串和给定的格式是正确的。请帮忙
答案 0 :(得分:5)
来自文档https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html:
SimpleDateFormat
中的小写h表示12小时格式的小时,而24小时格式表示大写字母H. 12,日期14:42无法解析。
答案 1 :(得分:2)
如果小时以24小时格式显示,则您应该使用HH
代替hh
作为小时模式。
有关详细信息,请参阅以下文档。
https://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html
答案 2 :(得分:2)
hh
用于一天中的时间,从1到12小时.14这不是这种小时表示的有效小时,因此您必须使用HH
或{ {1}}。前者用于从0-23显示的时间,后者用于1-24之间显示的时间。如果单个数字小时数不在kk
之前,则您很可能必须使用HH
或H
/ k
。
答案 3 :(得分:0)
DateTimeFormatter cal = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm");
LocalDateTime.parse("2018-01-01 14:42", cal);
无异常或其他错误运行。
您使用的日期时间类DateFormat
和SimpleDateFormat
已经过时,而且非常麻烦。我建议你立即停止使用它们。而是使用现代Java日期和时间API java.time
。它是在Java规范请求(JSR)310(某种程度上仍然依赖于API的名称)中描述的,差不多四年前发布的。
正如其他人正确指出的那样,您的错误是您在格式模式字符串中使用了小写hh
,您应该在一天中使用大写HH
。只是现代课程尝试更有帮助的一个小例子,尝试相同。如果我在上面的代码中以格式模式插入hh
,我的程序会崩溃(因为没有try-catch构造),并带有DateTimeParseException
,并带有以下消息:
无法解析文字'2018-01-01 14:42':无效的值 ClockHourOfAmPm(有效值1 - 12):14
虽然可能仍然有点深奥,但它非常精确。我敢于希望结合文档告诉你你做错了什么。
未选中该异常,因此解析时不需要try-catch。另一方面,如果您愿意,可以使用一个(如果您不确定日期时间字符串的格式是否正确,则应该)。
java.time
。