日期时间比较给出不正确的结果

Datetime comparison is giving incorrect result

此代码应为 false,因为 11:49 在 12:07 之前。但是代码正在返回 true。

如果我将 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")));

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

"hh" 是 12 小时制,因此“12:07”被解释为“12:07 AM”。你可能想要 "HH"。参见 https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html

您在格式中遗漏了一些内容。

hh 格式适用于 am/pm (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。这样就够了。

除了其他答案之外,您还可以通过在 SimpleDateFormat 对象上调用 setLenient(false) 来更容易地发现此类隐藏问题。

默认情况下,解析过程是 lenient,即解析成功,即使 String 不完全匹配模式。

你写道,在小时部分写 "13" 效果很好,增加了你的困惑。 lenient 设置为 falseparse 会抛出 ParseException,因为 "13" 不会t 匹配 "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")));