11

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

4

6 回答 6

22

你应该得到一个例外,因为“23:00 PM”不是一个有效的字符串,但Java的日期/时间设施在处理日期解析时默认是宽松的。

逻辑是 23:00 PM 是 11:00 PM 之后的 12 小时,即第二天上午 11:00。您还会看到诸如“April 31”之类的内容被解析为“May 1”(4 月 30 日之后的一天)。

如果您不想要这种行为,请使用DateFormat#setLenient(boolean)在 SimpleDateFormat 上将 lenient 属性设置为 false ,并且在传入无效日期/时间时会出现异常。

于 2009-07-20T18:01:04.570 回答
17

如果您要解析 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
于 2009-07-20T17:49:03.317 回答
15

你试过HH:mm aa吗?

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

于 2009-07-20T17:49:45.123 回答
4

以下是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”。但是,如果您输入不可能的数据,我不会期望得到有效的结果。

于 2009-07-20T17:51:58.753 回答
2

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

于 2009-07-20T17:49:51.223 回答
1

我猜它会做类似的事情:

hours = hours % 12;

以确保小时在适当的范围内。

于 2009-07-20T17:47:31.760 回答