为什么使用SimpleDateFormat(“hh:mm aa”)解析’23:00 PM’返回上午11点?

为什么使用SimpleDateFormat("hh:mm aa")解析’23:00 PM’返回上午11点?

您应该获得exception,因为“23:00 PM”不是有效的字符串,但在处理日期解析时,Java的日期/时间工具默认是宽松的。

逻辑是23:00 PM是在晚上11:00之后的12小时,即第二天的11:00 AM。 您还会看到“4月31日”被解析为“5月1日”(4月30日后的一天)。

如果您不想要这种行为,请使用DateFormat #setLenient(boolean)在SimpleDateFormat 上将lenient属性设置为false,并在传递无效日期/时间时获得exception。

如果要解析24小时制,你想要“HH:mm aa”作为格式。

 public static void main(String[] args) throws ParseException { SimpleDateFormat df = new SimpleDateFormat("HH:mm aa"); final Date date = df.parse("23:00 PM"); System.out.println("date = " + df.format(date)); } 

输出

 date = 23:00 PM 

你试过HH:mm aa

HH是24小时,而hh是12小时。

以下是javadoc中指定的格式选项

 H Hour in day (0-23) k Hour in day (1-24) K Hour in am/pm (0-11) h Hour in am/pm (1-12) 

请注意,“h”将是1-12小时。 如果你想处理1-24,试试“k”。 0-23尝试“H”。 但如果你输入不可能的数据,我不会指望有效的结果。

下午23:00可以被认为是第二天上午11点。 Javascript和PHP的工作方式非常相似,但我不能说Java。

我猜它会像:

 hours = hours % 12; 

确保工作时间在适当的范围内。