我想检查一下我的事件是否重叠。我以日期格式保存了开始时间和结束时间。我的尝试是通过比较来检查日期是否重叠。但它有时会失败。
大多数在晚上11点到12点的价值以及早上12点到凌晨1点的价值失败。有时也会在另一段时间内失败。
因为我将时间段存储为,
datefrom - Mon mar 14 23:00:00 dateto - Mon mar 14 00:00:00
现在我尝试将时间段添加为:
checkFromDate - Mon mar 14 12:14:00 checkToDate - Mon mar 14 11:14:00
然后返回true。显示事件存在虽然它没有。
日期格式为:
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));
}
}
这个剂量没有用,所以我想只比较日期的小时和分钟。我的尝试是从日期开始的几小时和几分钟,然后比较它们,它在评论中。但它需要一些其他逻辑。
有人可以帮我这个吗?
编辑:
当我再次测试时,我发现如果一旦条件返回true,那么第二次再持续一段时间它也显示为真,虽然它不是真的。
就像现在一样,我有一个下午12:50 - 下午1:50的事件,我试图添加另一个事件 时间12:00 pm - 1:00 pm返回true,计数为1.这是对的。
但是,如果我试图改变时间而不回去,没有刷新活动,我试图将时间改为下午12:00到下午12:30这也是因为它返回true,计数为1,因为这不应该是真的没有这个时间段的事件。
如果我再次返回如果我尝试将事件添加到中午12:00到下午12:30它返回false,则会成功添加。现在,我不知道出了什么问题?
我想我需要刷新我存储比较事件的列表。我怎么能这样做?我应该在哪里这样做?
谢谢。
答案 0 :(得分:1)
也许我误解了这个问题,但时间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之间存在。 / p>
所以代码可能是正确的,你的测试只是混乱。
答案 1 :(得分:0)
假设您的日期是这样的:
Mon mar 14 12:14:00
你的格式应该是这样的
SimpleDateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss");
你刚刚为你的dayOfWeek输入了一个E
编辑:
SimpleDateFormat就像一个解析器。您在其中使用的每个参数,指示解析器应该对其执行的方式。
让我们回到你的例子我的意思是&gt;&gt;&gt; 3月14日12:14:00
如果您使用此:
SimpleDateFormat df = new SimpleDateFormat("E MMM dd HH:mm:ss");
您将告诉解析器只有String的第一个字符表示DayNameInTheWeek。在我们的例子中,它将M作为星期几的指标。这与Date不同。一周中哪一天M指的是什么?!?!?!?! 支持的格式是示例列中的参数:
如你所见,星期几的最小可接受长度为3,如TEU,MON,FRI等......
答案 2 :(得分:0)
如果您有两个日期范围,start1
到end1
和start2
到end2
,并且您想看看它们是否重叠,请尝试从另一边。
检查不要是否重叠。如果其中一个在另一个开始之前结束,则它们不会重叠:
end1 <= start2 or end2 <= start1
否定,看看它们是否重叠,给我们:
end1 > start2 and end2 > start1
或者,在带有Date
个对象的Java中,它变为:
if (end1.after(start2) && end2.after(start1))