Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么日期比较失败?_Java_Android_Datetime_Overlap - Fatal编程技术网

Java 为什么日期比较失败?

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

我想检查我的事件是否重叠。我以日期格式保存了开始时间和结束时间。我的尝试是通过比较来检查日期是否重叠。但它有时会失败

大多数情况下,它会在晚上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