Java 为什么日期比较失败?
我想检查我的事件是否重叠。我以日期格式保存了开始时间和结束时间。我的尝试是通过比较来检查日期是否重叠。但它有时会失败 大多数情况下,它会在晚上11点到凌晨12点的值和凌晨12点到凌晨1点的值出现故障。有时在这两个时间段之间也会出现故障 因为我将时间段存储为 日期从——3月14日星期一23:00:00 日期至——星期一至三月十四日00:00:00 现在我尝试将时间段添加为: checkFromDate——周一至三月14日12:14:00 checkToDate——周一至三月十四日11:14:00 它返回真的。显示事件存在,但不存在 日期格式为:Java 为什么日期比较失败?,java,android,datetime,overlap,Java,Android,Datetime,Overlap,我想检查我的事件是否重叠。我以日期格式保存了开始时间和结束时间。我的尝试是通过比较来检查日期是否重叠。但它有时会失败 大多数情况下,它会在晚上11点到凌晨12点的值和凌晨12点到凌晨1点的值出现故障。有时在这两个时间段之间也会出现故障 因为我将时间段存储为 日期从——3月14日星期一23:00:00 日期至——星期一至三月十四日00:00:00 现在我尝试将时间段添加为: checkFromDate——周一至三月14日12:14:00 checkToDate——周一至三月十四日11:14:00
df = new SimpleDateFormat("E MMM dd HH:mm:ss zzzz yyyy");
日期格式有问题吗
检查重叠函数
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));
}
}
public void checkOverlappingEvents()
{
List checkOverlappingEvents=new ArrayList();
EventTableHelper EventTableHelper=新的EventTableHelper(AddEventActivity.this);
开关(星期五)
{
案例“Mon”:
checkOverlappingEvents=eventTableHelper.getAllEvents(“Mon”);
对于(EventData e:checkOverlappingEvents)
{
df=新的简化格式(“E-MMM-dd-HH:mm:ss-zz-yyyy”);
日期checkFromDate=新日期();
日期检查日期=新日期();
试一试{
checkFromDate=df.parse(例如getFromDate());
checkToDate=df.parse(e.getToDate());
}捕获(解析异常){
}
//int startHours=datefrom.getHours();
//int endHours=dateto.getMinutes();
//字符串startTime=checkFromDate.getHours()+“:”+checkFromDate.getMinutes();
//字符串endTime=checkToDate.getHours()+“:“+checkToDate.getMinutes();
//字符串startDate=datefrom.getHours()+“:“+datefrom.getMinutes();
//字符串endDate=dateto.getHours()+“:“+dateto.getMinutes();
if(datefrom.compareTo(checkToDate)=checkFromDate.compareTo(dateto))
{
重叠事件=真;
计数++;
Log.d(“count”,String.valueOf(count));
}
}
这没有帮助,所以我想只比较日期的小时和分钟。我的尝试是从日期中获取小时和分钟,并进行比较,它们在注释中。但它需要一些其他逻辑
有人能帮我吗
编辑:
当我再次测试时,我发现如果条件一次返回true,那么在另一个时间段的第二次也会显示true,尽管它不是true
像现在一样,我有一个12:50-1:50的活动,我尝试添加另一个活动
时间为12:00pm-1:00pm,返回true,,count为1。这是正确的
但是,如果我尝试更改时间而不返回,也不刷新活动,我尝试将时间更改为12:00pm到12:30pm,因为它也返回真值,计数为1,因为这不应该是真的,没有此时间段的事件
再次,如果我返回,如果我尝试添加12:00pm到12:30pm的事件,它返回false,它被成功添加。现在,我不知道这是怎么回事
我想我需要刷新存储比较事件的列表。我该如何做,应该在哪里做
谢谢。假设您的约会是这样的: 3月14日星期一12:14:00 你的格式应该是这样的
SimpleDateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss");
您刚刚输入了一个E作为您的工作日
编辑:
SimpleDataFormat的作用类似于解析器。您在其中使用的每个参数都指示解析器应该如何处理它
让我们回到你的例子,我的意思是>>>周一-三月14日12:14:00
如果您使用此选项:
SimpleDateFormat df = new SimpleDateFormat("E MMM dd HH:mm:ss");
您将告诉解析器,字符串中只有第一个字符表示周中的DayNameInWeek。在我们的示例中,它将M作为周中某一天的指示符。这与Date不同。M指的是周中的哪一天?!?!?!?!
支持的格式为“示例”列中的参数:
正如您所看到的,一周中最短可接受的时间长度为3天,如标准箱、周一、周五等。如果您有两个日期范围,
start1
到end1
,以及start2
到end2
,如果您想查看它们是否重叠,请尝试从另一边查看
检查是否不重叠。如果其中一个在另一个开始之前结束,则不重叠:
end1 <= start2 or end2 <= start1
或者,在带有Date
对象的Java中,它变成:
if (end1.after(start2) && end2.after(start1))
也许我误解了这个问题,但时间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之间
因此,代码可能是正确的,您的测试只是比较混乱。尝试使用日期格式函数,如.befor或.after或.equals I thing,这可以帮助您完成代码吗?@RakshitNawanii也尝试过这一点——startDate1.before(endDate2)和&startDate2.before(endDate1);结果也是一样的。你能为我打印你正在比较的两个日期,然后给我看结果吗?然后我如何将11:00到12:00的事件添加到上午12:00?有时它在11:00到11:50之间显示为真,我也不知道有什么错。比较起来会有什么变化?@Smartiz
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