【发布时间】:2016-08-18 17:33:29
【问题描述】:
我已经整理了一个方法来检查给定日期是否在某个上下限内。
它不应该考虑时间,只考虑日期。这似乎是一项非常简单的任务,但在调试时我遇到了一些奇怪的行为。
我尝试了不同的方法来从输入日期中删除时间值。 (inDate.) 但它们似乎都给了我同样的意外行为,将我的 inLeft 日期放在 inLeft 之前,从而使函数结果为 false。
从截图中可以看出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;
}
我仍然不明白为什么我的初始解决方案不起作用。
【问题讨论】:
-
你试过使用 SimpleDateFormatter 吗?
-
看不到图片中的错误等。
-
你的意思是
SimpleDateFormat?那不是用来在字符串表示和日期之间移动吗? -
请在此处复制并粘贴您的代码,而不是发布屏幕截图。
标签: java android jodatime datetime-conversion datetime-comparison