为什么日期比较失败?

时间:2016-03-14 06:06:32

标签: java android datetime overlap

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

大多数在晚上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,则会成功添加。现在,我不知道出了什么问题?

我想我需要刷新我存储比较事件的列表。我怎么能这样做?我应该在哪里这样做?

谢谢。

3 个答案:

答案 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指的是什么?!?!?!?! 支持的格式是示例列中的参数:

enter image description here

如你所见,星期几的最小可接受长度为3,如TEU,MON,FRI等......

答案 2 :(得分:0)

如果您有两个日期范围,start1end1start2end2,并且您想看看它们是否重叠,请尝试从另一边。

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

end1 <= start2  or  end2 <= start1

否定,看看它们是否重叠,给我们:

end1 > start2  and  end2 > start1

或者,在带有Date个对象的Java中,它变为:

if (end1.after(start2) && end2.after(start1))