日期时间比较结果不正确

时间:2018-06-01 16:23:47

标签: java date datetime simpledateformat date-comparison

此代码应该是假的,因为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")));

4 个答案:

答案 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")));