当前位置: 首页 > 知识库问答 >
问题:

如何检查时间是否重叠?

安毅
2023-03-14

我创建了一个事件。现在我想检查它们是否重叠。我在数据库中以日期格式存储了开始时间和结束时间。

现在我想检查事件的时间是否重叠。为此,我想获取所有事件start Time和endTime,从日期检索小时和分钟,然后将小时和分钟与当前小时和分钟进行比较。

日期格式如下:df=新的SimpleDateFormat(“E-MMM-dd-HH:mm:ss-zz-yyyy”);

我第一次尝试通过查询比较两个日期,但没有很好的帮助。如果当时事件不存在,那么有时它也会返回true。

我的第一次尝试是这样的:

public int returnCount(String startTime, String endTime, String day)
{
    String selectQuery = "SELECT COUNT(*) FROM " + TABLE + " WHERE " + KEY_DAY_OF_WEEK + " = '" + day + "'" + " AND "

            + "(" + KEY_FROM_DATE + " <= '" + startTime
            + "' AND '" + startTime + "' <= " + KEY_TO_DATE + ") OR "

            + " (" + KEY_FROM_DATE + " <= '" + endTime
            + "' AND '" + endTime + "' <= " + KEY_TO_DATE + ") OR "

            + " (" + KEY_FROM_DATE + " <= '" + startTime
            + "' AND '" + endTime + "' <= " + KEY_TO_DATE + ") OR "

            + " (" + KEY_FROM_DATE + " <= '" + endTime
            + "' AND '" + startTime + "' <= " + KEY_FROM_DATE + ") OR "

            + " (" + KEY_TO_DATE + " <= '" + startTime
            + "' AND '" + endTime + "' <= " + KEY_TO_DATE + ") OR "

            + " ('" + startTime + "' < " + KEY_FROM_DATE
            + " AND " + KEY_TO_DATE + " < '" + endTime + "')";

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor mCount= db.rawQuery(selectQuery,null);

    if (mCount.moveToFirst()) {
        do {
            EventData event = new EventData();
            count = mCount.getInt(0);
        } while (mCount.moveToNext());
    }

    Log.d("query",selectQuery);

    Log.d("count",String.valueOf(count));
    mCount.close();

    return count;

}

所以现在我想做一个改变,比较小时和分钟。为此,我尝试将小时和分钟转换为字符串,然后进行比较,但这并没有什么帮助。

 public void checkOverlappingEvents()
{

    List<EventData> checkOverlappingEvents = new ArrayList<>();

    EventTableHelper eventTableHelper = new EventTableHelper(AddEventActivity.this);


    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(startTime.equals(startDate) && endTime.equals(endDate))
        {
            overlapEvents = true;
        }

    }

}

getAllEvents查询:

 public List<EventData> getAllEvents(String day) {
    List<EventData> conList = new ArrayList<EventData>();

    String selectQuery = "SELECT  * FROM " + TABLE + " WHERE " + KEY_DAY_OF_WEEK + " = '" + day + "'";

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    if (cursor.moveToFirst()) {
        do {

            EventData event = new EventData();

            event.setId(Integer.parseInt(cursor.getString(0)));
            event.setTitle(cursor.getString(1));
            event.setFromDate(cursor.getString(2));
            event.setToDate(cursor.getString(3));
            event.setDayOfWeek(cursor.getString(4));
            event.setLocation(cursor.getString(5));
            event.setNotificationTime(cursor.getString(6));
            event.setTableId(Integer.parseInt(cursor.getString(7)));
            event.setNotificationId(Integer.parseInt(cursor.getString(8)));
            event.setNotification(cursor.getString(9));



            conList.add(event);
        } while (cursor.moveToNext());
    }

    return conList;
}

编辑:

public void checkOverlappingEvents()
{

    List<EventData> checkOverlappingEvents = new ArrayList<>();

    EventTableHelper eventTableHelper = new EventTableHelper(AddEventActivity.this);


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

        }

checkToDate.getMinutes();

        if(datefrom.compareTo(checkToDate) == checkFromDate.compareTo(dateto))
        {
            overlapEvents = true;
        }

    }

}

我这样做是为了让它能很好地添加新事件。检查其他日期是否重叠,但我也想更新事件。

如果我使用相同的函数并且只更改现有事件的结束时间,那么当开始时间相同时,它总是显示事件存在。如何在更新事件时进行比较?

有人可以帮助我如何将小时和分钟与当前小时和分钟进行比较?

共有2个答案

笪烨
2023-03-14

我建议您将字符串< code>startTime和< code>endTime转换为< code>Date对象,并使用< code > Date 1 . compare to(Date 2),如果< code>date2发生在< code >之后,则返回< code>1,如果在< code >之前,则返回< code>0同时。所以你会有这样的东西:

if(start1.compareTo(start2) != end1.compareTo(start2)) /*overlaps*/;  

当你想象它的时候,你可以看到它是如何工作的:

start1--------start2------end1--------end2  → will return true
start1--------end1------start2--------end2  → will return false  

请注意,这计算了一个范围恰好在另一个范围重叠时开始的情况。如果您不希望这样,您应该处理开始与另一端相同的情况

韩弘方
2023-03-14

我会使用< code>Date对象

Date startDate1 = ...
Date startDate2 = ...
Date endDate1 = ...
Date endDate2 = ...

boolean overlapping = datesOverlap(startDate1, endDate1, startDate2, endDate2);

private boolean datesOverlap(Date startDate1, endDate1, startDate2, endDate2){
    return startDate1.before(endDate2) && startDate2.before(endDate1);
}
 类似资料:
  • 问题内容: 我有一个包含以下字段的MySQL表: 名称 开始时间 时间结束 并且是MySQL 字段(不是)。我需要一种定期“扫描”表以查看表中时间范围是否重叠的方法。如果有来自和的其他事件,我想提醒您时间重叠。 真的没什么好想的,我只想知道是否存在重叠。 我将使用PHP执行此操作。 问题答案: 这是我很多年前找到答案的查询模式: 要找到“任何重叠”,您可以将时间范围的 相对 两端彼此进行比较。我必

  • 问题内容: 我需要检查当前时间是否在时间范围内。最简单的情况是time_end> time_start: 但是,当用户输入结束时间小于开始时间的时间范围时,麻烦就开始了,例如“ 23:00-06:00”。像“ 00:00”这样的时间将在此范围内。大约5年前,我编写了以下PHP函数: 现在我需要做同样的事情,但是我想让它看起来好看。因此,我应该使用哪种算法来确定当前时间‘00:00’是否在 反向 范

  • 问题内容: 我需要检查当前时间是否在8 AM和3 PM之间。如果在这些时间范围之间,那么我需要返回yes,否则返回false。 但是我不确定我应该在这里使用吗?我可以不使用时间戳并相应地检查时间戳吗?什么是正确的方法? 我仍在使用Java 7。 问题答案: 如果您使用的是Java 8之前的Java版本,请查看Joda的API文档。 具体来说,有一个AbstractInterval#contains

  • 我正在开发一个spring api,在这个api中我使用postgres并保存一个timestamp类型的字段,字段名为。现在我想检查这个字段是否在两个不同的时间戳之间。 现在我正在使用这个: 是否可以在之间使用

  • 我正在和一个班合作。我正在使用一些方法。 我需要检查我需要传递的参数,来调用这个方法。我就是这样做的 它工作得很好,但我知道有些方法有重载(没有参数),但这段代码只显示最后声明的方法(有参数要调用)。我怎样才能同时得到这两个重载? 这就是它的样子(我知道这个方法有重载) 例如另一个类:类扫描比打印方法方法 要扫描的代码 类的构造函数,它扫描给定的对象。 这就是我打印它们的方式。

  • 问题内容: 在我的应用中,我创建了一个代表高中班级的对象。该对象包含2个Calendar对象,分别代表班级每天的开始和结束时间。当用户创建作业时,我要检查当前时间是否在任何课程的两次之间。如果是的话,我知道作业是在该课程中创建的。这是我当前无法使用的代码,因为.getTime()返回一个包含月和日的日期,而我只想比较小时和分钟。因此,如何修剪返回的日期,使其仅包含一天中的时间?使用joda- ti