2016-03-13 88 views
0

我创建了一个活动。现在我想检查它们是否相互重叠。我在数据库中以日期格式存储了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; 
     } 

    } 

} 

我这样做,所以它适用于添加一个新的事件。检查其他日期是否重叠,但我想更新事件。

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

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

回答

0

我建议你转换您的字符串startTimeendTimeDate对象,并使用date1.compareTo(date2),它返回1如果date2发生后,-1如果说之前,0同一时间。所以,你将有类似的东西:

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

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

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

注意,这个计算的情况下一个范围开始正是当对方停下,重叠。如果你想,否则,你应该处理情况下,开始是一样的另一端

+0

请问这种检查所有重叠的时间? – user5881997

+0

现在我在下午7点到晚上8点有一个活动,现在我试着在下午6点到6点30分再添加一个活动。在这个时候没有事件仍然是真的。如果我尝试这种方式 – user5881997

+0

该尝试的来源?因为使用Date对象要比自己计算好得多 –

0

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

与之前和之前有什么区别?@Joe Maher – user5881997

+0

@ user5881997比较它们,返回-1(之前),0(同一时间)或1(之后),并明确之前检查是否是之前和之前我们需要在这种情况下 –

+0

好吧,这是很好的信息。你能检查我编辑的问题,并帮助我一样吗? @Joe Maher – user5881997