我已经整理了一种方法,该方法应该检查给定日期是否在某个下限和上限之内。
它不应该考虑时间,只考虑日期。这似乎是一项非常简单的任务,但是在调试它时我遇到了一些奇怪的行为。
我尝试了不同的方法来从输入日期中删除时间值。( inDate
.) 但它们似乎都给了我同样的意外行为,即把我的inLeft
日期放在前面inLeft
,从而使函数结果为假。
正如您从屏幕截图中看到的那样inLeft
,inLeft
它们相等(如果我们忽略时间)那么为什么会int leftLimit = DateTimeComparator.getDateOnlyInstance().compare(inLeft, inDate);
导致 1 而不是 0?
我的结论是我做错了什么但找不到什么。如果这是完全明显的事情,请原谅我。
这是我的代码:
protected boolean checkDateInRange(Date inDate, Date inLeft, Date inRight) {
System.out.println("inDate = " + inDate);
System.out.println("inLeft = " + inLeft);
System.out.println("inRight = " + inRight);
int leftLimit = DateTimeComparator.getDateOnlyInstance().compare(inLeft, inDate);
int rightLimit = DateTimeComparator.getDateOnlyInstance().compare(inDate, inRight);
System.out.println("leftLimit = " + leftLimit);
System.out.println("rightLimit = " + rightLimit);
if (leftLimit > 0 || rightLimit > 0) {
return false;
}
return true;
}
I/System.out: inDate = Mon Sep 26 00:00:00 GMT+02:00 2016
I/System.out: inLeft = Mon Sep 26 20:14:13 GMT+02:00 2016
I/System.out: inRight = Mon Sep 26 00:00:00 GMT+02:00 2016
I/System.out: leftLimit = 1
I/System.out: rightLimit = 0
问题是leftLimit == 1,而不是0,没有时间的inDate和inLeft是一样的。但 leftLimit 仍然结果为 1。
编辑(最终解决方案):根据 sumandas 和 Roberts 的解决方案,我编写了一种新方法,可以给我预期的行为。
新代码:
protected boolean checkDateInRange(Date inDate, Date inLeft, Date inRight) {
SimpleDateFormat simpleDateFormatter = new SimpleDateFormat("yyyy-MM-dd");
String dateString = simpleDateFormatter.format(inDate);
String leftString = simpleDateFormatter.format(inLeft);
String rightString = simpleDateFormatter.format(inRight);
if (leftString.compareTo(dateString) > 0 || dateString.compareTo(rightString) > 0)
return false;
return true;
}
我仍然不明白为什么我的初始解决方案不起作用。