为什么解析“23:00 PM”并SimpleDateFormat("hh:mm aa")
返回上午 11 点?
问问题
35180 次
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
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 回答