日期时间比较给出不正确的结果
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 设置为 false
,parse
会抛出 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")));
此代码应为 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 设置为 false
,parse
会抛出 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")));