java - 如何检查时间是否重叠?

标签 java android datetime time overlap

我创建了一个 Activity 。现在我想检查它们是否相互重叠。我已将 startTime 和 endTime 以日期格式存储在数据库中。

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

日期格式是这样的:df = new SimpleDateFormat("E MMM dd HH:mm:ss zzzz 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;
        }

    }

}

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

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

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

最佳答案

我会使用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);
}

关于java - 如何检查时间是否重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35967487/

相关文章:

android - 有什么方法可以控制 NavigationView header 中的 View 吗?

java - 如何在 Java 8 中自动本地化日期格式

Java - 为我指明正确的方向

java - 以秒为单位存储准确的音频位置是否安全?

java - 如何使用java将此字符串转换为二维数组

Android OpenCV 致命信号 11,(错误的编码习惯?)

java - 正则表达式为 -1 到 999,但可以接受空白

java - Android Retrofit2 错误@Url

performance - 为什么我的 postgreSQL 索引没有被使用?

javascript - Spring 模型 setter 中的 AngularJS 日期选择器值