此代码应该是假的,因为11:49是在12:07之前。但代码正在返回。
如果我将12:07更改为13:00,则会给出错误,这是正确的。我不知道12:07有什么问题。我错过了什么吗?我尝试了compareTo和giveTime方法以及相同的结果。
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm");
System.out.println(format.parse("5/31/2018 11:49").after(format.parse("5/31/2018 12:07")));
答案 0 :(得分:7)
hh
(范围1-12),12:07
被解析为00:07
:
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm");
System.out.println(format.parse("5/31/2018 00:07").equals(format.parse("5/31/2018 12:07"))); // true
使用HH
(范围0-23)代替,它将产生所需的结果:
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm");
System.out.println(format.parse("5/31/2018 11:49").after(format.parse("5/31/2018 12:07"))); // false
答案 1 :(得分:3)
“hh”是12小时制,所以“12:07”被解释为“12:07 AM”。你可能想要“HH”。见https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html
答案 2 :(得分:3)
您遗漏了格式中的内容。
hh格式适用于上午/下午(1-12)小时,如文档中所示:https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
如果您运行以下内容:
System.out.println(format.parse("5/31/2018 12:07"));
你会得到:
Thu May 31 00:07:00 ART 2018
这就是你成真的原因。
您应该将时间格式更改为:HH:mm。那就足够了。
答案 3 :(得分:1)
除了其他答案之外,您还可以通过调用setLenient(false)
对象上的SimpleDateFormat
来更轻松地捕获此类隐藏问题。
默认情况下,解析过程是 lenient ,即解析成功,即使String
与模式不完全匹配。
你写道,在小时部分编写“13”工作正常,增加了你的困惑。如果 lenient 设置为false
,则parse
会抛出ParseException
,因为“13”与不匹配hh“,更明显地表明你的String
与模式不匹配。
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm");
format.setLenient(false);
// Next line will throw a ParseException, as the second call to parse now fails
System.out.println(format.parse("5/31/2018 11:49").after(format.parse("5/31/2018 13:07")));