【问题标题】:Why date comparison fails?为什么日期比较失败?
【发布时间】:2016-03-14 06:06:32
【问题描述】:

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

它在晚上 11 点到凌晨 12 点的值和上午 12 点到凌晨 1:00 的值失败。有时也会在其他时间段之间失败。

因为我有一个存储为的时间段,

datefrom -- Mon mar 14 23:00:00 dateto -- Mon mar 14 00:00:00

现在我尝试将时间段添加为:

checkFromDate -- 3 月 14 日星期一 12:14:00 checkToDate -- 3 月 14 日星期一 11:14:00

它返回true。显示事件存在,尽管它不存在。

日期格式为:

        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));

        }

    }

这无济于事,所以我想只比较日期的小时和分钟。我的尝试是从日期获取小时和分钟并比较它们,它以 cmets 为单位。但它需要一些其他的逻辑。

谁能帮我解决这个问题?

编辑:

当我再次测试时,我发现如果一旦条件返回 true,那么第二次在另一个时间段内也会显示 true,尽管它不是 true。

就像现在一样,我有一个下午 12:50 - 下午 1:50 的活动,我尝试添加另一个活动 时间 12:00 pm - 1:00 pm 并且返回 true,计数为 1。这是正确的。

但是,如果我再次尝试更改时间而不返回,而不刷新活动,我尝试将时间更改为下午 12:00 到下午 12:30,因为它也返回 true,计数为 1,因为这不应该是 true没有这个时间段的事件。

如果我一次又一次地返回如果我尝试添加 12:00 pm 到 12:30 pm 的事件,它返回 false,它会成功添加。现在这个我不知道是怎么回事?

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

谢谢。

【问题讨论】:

  • 尝试使用日期格式函数,如 .befor 或 .after 或 .equals 我觉得这可以帮助你
  • 你能指导我完成代码吗? @RakshitNawani
  • 我也试过了 -- startDate1.before(endDate2) && startDate2.before(endDate1);
  • 结果也一样。
  • 你能帮我打印你正在比较的两个日期,然后给我看结果吗

标签: java android datetime overlap


【解决方案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 之间。

所以代码可能是正确的,你的测试只是混淆了。

【讨论】:

  • 那么我怎样才能将晚上 11 点的活动添加到上午 12:00?有时它在晚上 11:00 到晚上 11:50 显示为真,我也不明白出了什么问题。
【解决方案2】:

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

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

end1 <= start2  or  end2 <= start1

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

end1 > start2  and  end2 > start1

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

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

【讨论】:

    【解决方案3】:

    假设你的日期是这样的:

    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 作为星期几的指标。这与日期不同。 M 周中的哪一天指的是?!?!?!?! 支持的格式是示例列中的参数:

    正如您所见,一周中最不可接受的长度是 3,例如 TEU、MON、FRI 等...

    【讨论】:

    • 相比起来会有什么变化?@Smartiz
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多