尝试解析Date字符串时出现ParseException

时间:2018-01-09 14:51:54

标签: java date simpledateformat date-parsing datetime-parsing

我有一段代码用于解析日期字符串 -

    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)

我不确定为什么我会看到此错误,因为日期字符串和给定的格式是正确的。请帮忙

4 个答案:

答案 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之前,则您很可能必须使用HHH / k

答案 3 :(得分:0)

TL; DR

    DateTimeFormatter cal = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm");
    LocalDateTime.parse("2018-01-01 14:42", cal);

无异常或其他错误运行。

java.time

您使用的日期时间类DateFormatSimpleDateFormat已经过时,而且非常麻烦。我建议你立即停止使用它们。而是使用现代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。另一方面,如果您愿意,可以使用一个(如果您不确定日期时间字符串的格式是否正确,则应该)。

链接