尝试解析日期字符串时出现 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 不是这种小时表示的有效小时,因此您必须使用 HH
或 kk
。前者用于 0-23 显示的时间,后者用于 1-24 显示的时间。如果个位数小时前面没有 0
.
,您很可能必须使用 HH
或 H
/k
TL;DR
DateTimeFormatter cal = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm");
LocalDateTime.parse("2018-01-01 14:42", cal);
这运行没有异常或其他错误。
java.time
您使用的日期时间 类,DateFormat
和 SimpleDateFormat
,早就过时了,而且出了名的麻烦。我建议您立即停止使用它们。而是使用 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。另一方面,您可以根据需要使用一个(如果您不太确定日期时间字符串的格式是否正确,您应该这样做)。
链接
- Oracle tutorial: Date Time,解释如何使用
java.time
。
- Java Specification Request (JSR) 310,首次描述现代日期和时间 API。
我写了一段代码来解析日期字符串 -
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 不是这种小时表示的有效小时,因此您必须使用 HH
或 kk
。前者用于 0-23 显示的时间,后者用于 1-24 显示的时间。如果个位数小时前面没有 0
.
HH
或 H
/k
TL;DR
DateTimeFormatter cal = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm");
LocalDateTime.parse("2018-01-01 14:42", cal);
这运行没有异常或其他错误。
java.time
您使用的日期时间 类,DateFormat
和 SimpleDateFormat
,早就过时了,而且出了名的麻烦。我建议您立即停止使用它们。而是使用 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。另一方面,您可以根据需要使用一个(如果您不太确定日期时间字符串的格式是否正确,您应该这样做)。
链接
- Oracle tutorial: Date Time,解释如何使用
java.time
。 - Java Specification Request (JSR) 310,首次描述现代日期和时间 API。