繁体   English   中英

为什么日期比较失败?

[英]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 等...

如果你有两个日期范围, start1end1 ,并start2end2 ,并要看看他们是否重叠,尝试看看它从另一个侧面。

检查是否重叠。 如果其中一个在另一个开始之前结束,则它们不会重叠:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM