我使用以下代码来解析日期:
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那样的小时。
答案 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)