当标记为PM - Java 8时,无法解析单个数字小时

时间:2018-02-15 17:30:14

标签: java datetime simpledateformat date-format

我使用以下代码来解析日期:

DateFormat df = new SimpleDateFormat("MMM dd, yyyy H:mm a");
df.setLenient(false)

然后字符串Feb 6, 2017 13:50 PM匹配,但Feb 6, 2017 3:50 PM不匹配(请注意,小时是一位数)。如果将宽松选项设置为true,它们都匹配,但我不想,因为代码将开始接受像33:50那样的小时。

3 个答案:

答案 0 :(得分:2)

一起使用“H”和“a”格式选项是错误的。没有“13:50 PM”这样的时间。如果您使用24小时表示法(“H”),则无法向其添加AM / PM(“a”)。相反,您应该使用十二小时的符号“h”:

DateFormat df = new SimpleDateFormat("MMM dd, yyyy h:mm a");
// Here -------------------------------------------^
df.setLenient(false)

答案 1 :(得分:2)

其他答案是正确的,只需快速说明:不要忘记设置java.util.Locale,因为AM / PM字符串对语言环境敏感。

如果您创建没有特定区域设置的格式化程序,它将使用JVM的默认设置。大多数语言环境使用大写的AM / PM,因此适用于大多数环境和配置,但如果您想确保它一直有效,请使用特定的语言环境:

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("MMM d, yyyy h:mm a", Locale.US);
DateFormat df = new SimpleDateFormat("MMM dd, yyyy h:mm a", Locale.US);

这是因为某些语言环境使用不同的字符串(例如“a.m.”表示“es_US”语言环境,“fm”表示瑞典语,“午前”表示日语等等。)

答案 2 :(得分:1)

Java 8+版本:

java.time.format.DateTimeFormatter fmt = java.time.format.DateTimeFormatter.ofPattern("MMM d, yyyy h:mm a");
// This will fail to parse: Invalid value for HourOfDay (valid values 0 - 23): 25
java.time.LocalDateTime.parse("Feb 6, 2017 13:50 PM", fmt)
// This will parse
java.time.LocalDateTime.parse("Feb 6, 2017 3:50 PM", fmt)