尝试解析日期字符串时出现 ParseException

ParseException when trying to parse Date string

我写了一段代码来解析日期字符串 -

    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)

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

来自文档 https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html:

SimpleDateFormat中的小写h表示12小时格式的小时,而24小时格式用大写H表示。由于14 > 12,日期14:42解析失败。

如果小时以 24 小时格式显示,您应该使用 HH 而不是 hh 作为小时模式。 有关详细信息,请参阅下面的文档。

https://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

hh 用于一天中的时间,小时从 1 到 12。14 不是这种小时表示的有效小时,因此您必须使用 HHkk。前者用于 0-23 显示的时间,后者用于 1-24 显示的时间。如果个位数小时前面没有 0.

,您很可能必须使用 HHH/k

TL;DR

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

这运行没有异常或其他错误。

java.time

您使用的日期时间 类,DateFormatSimpleDateFormat,早就过时了,而且出了名的麻烦。我建议您立即停止使用它们。而是使用 java.time,现代 Java 日期和时间 API。在 Java Specification Request (JSR) 310(不知何故仍然依附于 API 的名称)中对其进行了描述后,它于近四年前问世。

正如其他人正确指出的那样,您的错误是您在格式模式字符串中使用了小写字母 hh,而您本应使用大写字母 HH 表示一天中的小时。只是现代 类 尝试提供更多帮助的一个小例子,请尝试相同。如果我在上面代码的格式模式中插入 hh,我的程序会崩溃(因为没有 try-catch 构造)并显示 DateTimeParseException 并显示以下消息:

Text '2018-01-01 14:42' could not be parsed: Invalid value for ClockHourOfAmPm (valid values 1 - 12): 14

虽然可能仍然有点深奥,但它非常精确。我敢于希望结合文档它会告诉你你做错了什么。

异常是未检查的,所以解析时不需要try-catch。另一方面,您可以根据需要使用一个(如果您不太确定日期时间字符串的格式是否正确,您应该这样做)。

链接