[英]Why date comparison fails?
我想检查我的事件是否重叠。 我以日期格式保存了开始时间和结束时间。 我的尝试是通过比较来检查日期是否重叠。 但它有时会失败。
大多数它在晚上 11 点到凌晨 12 点的值和上午 12:00 到凌晨 1:00 的值失败。 有时也会在另一个时间段之间失败。
因为我有一个时间段存储为,
datefrom -- 3 月 14 日星期一 23:00:00 dateto -- 3 月 14 日星期一 00:00:00
现在我尝试将时间段添加为:
checkFromDate -- 三月 14 日星期一 12:14:00 checkToDate -- 三月 14 日星期一 11:14:00
它返回真。 显示事件存在但不存在。
日期格式为:
df = new SimpleDateFormat("E MMM dd HH:mm:ss zzzz yyyy");
日期格式有问题吗??
checkOverlapping 函数
public void checkOverlappingEvents()
{
List<EventData> checkOverlappingEvents = new ArrayList<>();
EventTableHelper eventTableHelper = new EventTableHelper(AddEventActivity.this);
switch (dayOfWeek)
{
case "Mon":
checkOverlappingEvents = eventTableHelper.getAllEvents("Mon");
for (EventData e : checkOverlappingEvents)
{
df = new SimpleDateFormat("E MMM dd HH:mm:ss zzzz yyyy");
Date checkFromDate = new Date();
Date checkToDate = new Date();
try {
checkFromDate = df.parse(e.getFromDate());
checkToDate = df.parse(e.getToDate());
} catch (ParseException ex) {
}
// int startHours = datefrom.getHours();
// int endHours = dateto.getMinutes();
// String startTime = checkFromDate.getHours() + ":" + checkFromDate.getMinutes();
// String endTime = checkToDate.getHours() + ":" + checkToDate.getMinutes();
// String startDate = datefrom.getHours() + ":" + datefrom.getMinutes();
// String endDate = dateto.getHours() + ":" + dateto.getMinutes();
if(datefrom.compareTo(checkToDate) == checkFromDate.compareTo(dateto))
{
overlapEvents = true;
count ++;
Log.d("count",String.valueOf(count));
}
}
这没有帮助,所以我想只比较日期的小时和分钟。 我的尝试是从日期中获取小时和分钟并比较它们,它在评论中。 但它需要一些其他的逻辑。
任何人都可以帮我解决这个问题吗?
编辑 :
当我再次测试时,我发现如果一旦条件返回真,那么在另一个时间段内第二次它也会显示为真,尽管它不是真的。
就像现在,我有一个 12:50 pm - 1:50 pm 的事件,我尝试添加另一个时间为 12:00 pm - 1:00 pm 的事件,结果返回 true,count 为 1。这是正确的。
但是,如果我尝试更改时间而不返回,不刷新活动,我尝试将时间更改为下午 12:00 到下午 12:30,因为这也返回 true,count 为 1,因为这不应该是 true 没有这个时间段的事件。
如果我一次又一次地返回如果我尝试添加下午 12:00 到下午 12:30 的事件,它返回 false,它会成功添加。 现在这个我不知道出了什么问题?
我想我需要刷新存储比较事件的列表。 我该怎么做,我应该在哪里做?
谢谢你。
也许我误解了这个问题,但 00:00:00 的时间是 23:00:00 之前。 我对其进行了测试以确保:
SimpleDateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss");
System.out.println(df.parse("Mon mar 14 23:00:00").getTime()); // 6296400000
System.out.println(df.parse("Mon mar 14 00:00:00").getTime()); // 6213600000
因此,日期 Mon mar 14 12:14:00 -- Mon mar 14 11:14:00 将存在于 Mon mar 14 00:00:00 -- Mon mar 14 23:00:00 之间。
所以代码可能是正确的,你的测试只是混乱。
假设您的日期是这样的:
3 月 14 日星期一 12:14:00
你的格式应该是这样的
SimpleDateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss");
您刚刚为 dayOfWeek 输入了一个 E
编辑 :
SimpleDateFormat 就像一个解析器。 您在其中使用的每个参数,都表明解析器应对它的行为方式。
让我们回到你的例子,我的意思是 >>> Mon mar 14 12:14:00
如果你使用这个:
SimpleDateFormat df = new SimpleDateFormat("E MMM dd HH:mm:ss");
您将告诉解析器只有字符串的第一个字符表示 DayNameInTheWeek。 在我们的例子中,它以 M 作为它的星期几的指示器。 这与 Date 不同。 M 指的是星期几?!?!?!?! 支持的格式是示例列中的参数:
如您所见,一周中最不可接受的长度是 3,例如 TEU、MON、FRI 等...
如果你有两个日期范围, start1
至end1
,并start2
到end2
,并要看看他们是否重叠,尝试看看它从另一个侧面。
检查是否不重叠。 如果其中一个在另一个开始之前结束,则它们不会重叠:
end1 <= start2 or end2 <= start1
否定这一点,看看它们是否重叠,给我们:
end1 > start2 and end2 > start1
或者,在带有Date
对象的 Java 中,它变成:
if (end1.after(start2) && end2.after(start1))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.