2017-03-03 52 views
1

我正在處理以下問題。在我的用例中,用戶首次啓動應用程序時設置了兩個日期,即StartSleepingHours和StopSleepingHours。如何在Android中檢查當前時間是否與未來有間隔?

例如,它們可能看起來像StartSleepingHours:Thu 2 Mar 20:00 2017StopSleepingHours:Thu 2 Mar 8:00 2017(注意它們是在用戶設置日期之後的同一日期)。現在,我的問題是,我有一個定期任務,每15分鐘運行一次以檢查是否在StartSH和StopSH間隔之間確定是否啓動活動監視服務。

顯然,我不希望我的服務在睡覺時監視用戶的活動。目前,我試圖從StartSH和StopSH中僅提取小時和分鐘信息,並從中創建日期對象以便與現在進行比較,但我非常困惑和沮喪如何檢查現在是否在間隔內開始/在將來停止SH。

目前,我在我的代碼,這樣的:

public static boolean isWithinSH(Date startSH, Date now, Date stopSH) { 
    boolean isSH = false; 

    Calendar calendar = Calendar.getInstance(Locale.UK); 
    calendar.set(Calendar.HOUR_OF_DAY, startSH.getHours()); 
    calendar.set(Calendar.MINUTE, startSH.getMinutes()); 

    Date sameDayStartSH = calendar.getTime(); 

    calendar.set(Calendar.HOUR_OF_DAY, 23); 
    calendar.set(Calendar.MINUTE, 59); 
    Date midnight = calendar.getTime(); 

    calendar.add(Calendar.DAY_OF_WEEK, 1); 
    calendar.set(Calendar.HOUR_OF_DAY, stopSH.getHours()); 
    calendar.set(Calendar.MINUTE, stopSH.getMinutes()); 

    Date currentStopSH = calendar.getTime(); 


    if (now.before(midnight) && now.after(sameDayStartSH)) { 
     System.out.println("SLEEPING HOURS"); 
     isSH = true; 
    } else if (now.after(midnight) && now.before(currentStopSH)) { 
     System.out.println("SLEEPING HOURS"); 
     isSH = true; 
    } else { 
     System.out.println("NOT SLEEPING HOURS"); 
    } 
    return isSH; 
} 

我試圖測試一樣,在Java環境的方法:

public static void main(String[] args) { 


Calendar calendar = Calendar.getInstance(Locale.UK); 
    calendar.add(Calendar.DAY_OF_WEEK, -1); 
    calendar.set(Calendar.HOUR_OF_DAY, 20); 
    calendar.set(Calendar.MINUTE, 0); 

    Date StartSH = calendar.getTime(); 
    calendar.add(Calendar.DAY_OF_WEEK, 2); 
    calendar.set(Calendar.HOUR_OF_DAY, 9); 
    calendar.set(Calendar.MINUTE, 45); 

    Date StopSH = calendar.getTime(); 

    Date now = new Date(); // 9:42 

    if (isWithingSH(StartSH, now, StopSH)) { 
     System.out.println("SPEEPING HOURS"); 
    } else { 
     System.out.println("NOT SPEEPING HOURS"); 
    } 

} 

控制檯顯示不睡覺個小時,但我認爲它應該說休息時間9:30以前

+1

有isBefore和isAfter方法。你試過了嗎? –

+0

@VladMatvienko哈:D這是新的日期():) –

+0

@ cricket_007我認爲日期類只有在(日期日期)和befor(日期日期)之後,我在示例中使用 –

回答

3

如果我理解正確,你只關心小時/分鐘,所以你可以檢查當前小時是否在提供的範圍內用戶在這種情況下,檢查是否分鐘數內分鐘不等

public static boolean isWithingSH(Date startSH, Date now, Date stopSH) { 
    try { 
     SimpleDateFormat parser = new SimpleDateFormat("HH:mm", Locale.UK); 
     Date startTime = parser.parse(startSH.getHours() + ":" + startSH.getMinutes()); 
     Date endTime = parser.parse(stopSH.getHours() + ":" + stopSH.getMinutes()); 
     Date nowTime = parser.parse(now.getHours() + ":" + now.getMinutes()); 

     if(startTime.after(endTime)) { 
      if(endTime.after(nowTime)) { 
       return true; 
      } else { 
       return false; 
      } 
     } else { 
      if (startTime.before(nowTime) && endTime.after(nowTime)){ 
       return true; 
      } else { 
       return false; 
      } 
     } 
    } catch (java.text.ParseException e) { 
     return false; 
    } 
} 

但我會失去日期(您使用的是過時的方法),並使用jodatime庫,而不是這個question應該可以得出較爲清淡關於使用yodatime或任何其他第三方庫的優缺點

+0

謝謝你的回答。然而。該方法未能通過上面的主要方法進行檢查:/我在9:37調用方法,並將StopSH限制設置爲9:40,因此它應該有說睡眠時間仍然 –

+1

它失敗,因爲您將hour_of_day設置爲40而不是分鐘;),使日期爲3月05日16:00 –

+0

對不起。我糾正了測試方法,但仍然失敗:/ –

相關問題