2013-04-24 83 views
1

我有一個包含服務的程序。該程序的設置允許用戶設置,禁用和啓用時間。在這兩次之間(如果選項啓用當然),程序不應該工作。檢測當前時間是否在兩個設置時間之間

我實際上很難做到這一點。我已經成功地將毫秒中的「禁用」和「啓用」時間轉換成了。我有以下代碼,但它不能按預期工作。我想檢測當前時間是否在兩個設置時間之間,因此我可以在當時禁用服務。

public boolean isCurrentTimeBetween_enableDisable() {  
    long sysTime = System.currentTimeMillis(); 

    if((sysTime > disableTime && sysTime < enableTime)) { 
     return true; 
    } 
    return false; 
} 

任何人都可以給我更好的提示嗎?

UPDATE:

如果用戶選擇可以說

  • 禁用時間:15:00
  • 啓用時間:22:00

然後代碼工作正常。

但是,如果用戶選擇讓說:

  • 禁用時間:22:00
  • 啓用時間:06:00

那麼它顯然是啓用時間是第二天。所以我寫了下面的代碼:

if(todaysDisableDate(context).getTime() > enableAt.getTime()) { 
    enableCal.add(Calendar.DAY_OF_MONTH, 1); 
    enableAt = formatEnableDate.parse(enableCal.get(Calendar.DAY_OF_MONTH) + "-" +(enableCal.get(Calendar.MONTH)+1) + "-" + enableCal.get(Calendar.YEAR) + " " + endHours_string + ":" + endMinutes_string); 
} 

下面的代碼獲取實際日期。

public Date todaysDisableDate(Context context) { 
    Calendar disableCal = Calendar.getInstance(); 

    getTimeValues_preferences((ContextWrapper) context, true, false); // this only gets a string for hour and minute (which is set up in preferences) 

    Date disableAt = null; 

    try { 
     disableAt = formatDisableDate.parse(disableCal.get(Calendar.DAY_OF_MONTH)+"-"+(disableCal.get(Calendar.MONTH)+1)+"-"+disableCal.get(Calendar.YEAR)+" "+startHours_string+":"+startMinutes_string); // današnji datum z današnjo uro 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    return disableAt; 
} 

public Date todaysEnableDate(Context context) { 
    Calendar enableCal = Calendar.getInstance(); 

    getTimeValues_preferences((ContextWrapper) context, false, true); 

    Date enableAt = null; 
    try { 
     enableAt = formatEnableDate.parse(enableCal.get(Calendar.DAY_OF_MONTH)+"-"+(enableCal.get(Calendar.MONTH)+1)+"-"+enableCal.get(Calendar.YEAR)+" "+endHours_string+":"+endMinutes_string); // današnji datum z današnjo uro 

     if(todaysDisableDate(context).getTime() > enableAt.getTime()) {   
      enableCal.add(Calendar.DAY_OF_MONTH, 1); 
      enableAt = formatEnableDate.parse(enableCal.get(Calendar.DAY_OF_MONTH)+"-"+(enableCal.get(Calendar.MONTH)+1)+"-"+enableCal.get(Calendar.YEAR)+" "+endHours_string+":"+endMinutes_string); 
     } 
    } catch (ParseException e) { 
    } 
    return enableAt; 
} 

如果服務在00:00之前開始,代碼工作正常。但是,如果在午夜後在服務啓動(次日),然後我得到的方法isCurrentTimeBetween_enableDisable()假的,因爲方法​​和todaysEnableDate(Context context)被拉出第二天(在同一天體系小時是)

+4

那麼看起來有點笨拙(我寧願只是'返回sysTime> disableTime && sysTime 2013-04-24 17:44:01

+0

我編輯了我的問題。 – rootpanthera 2013-04-24 17:55:37

+0

可能使用'joda-time'庫嗎? – 2013-04-24 19:06:58

回答

0

我會建議您使用開始日期和結束日期本身......並且不要將它們轉換爲毫秒。但是,只有當你不確定的時候。

private String compareStringOne = "9:45"; 
private String compareStringTwo = "1:45"; 

SimpleDateFormat inputParser = new SimpleDateFormat(inputFormat, Locale.US); 

private void compareDates(){ 
    Calendar now = Calendar.getInstance(); 

    int hour = now.get(Calendar.HOUR); 
    int minute = now.get(Calendar.MINUTE); 

    date = parseDate(hour + ":" + minute); 
    dateCompareOne = parseDate(compareStringOne); 
    dateCompareTwo = parseDate(compareStringTwo); 

    if (dateCompareOne.before(date) && dateCompareTwo.after(date)) { 
     //This is where you determine if the date is inbetween 
    } 
} 

private Date parseDate(String date) { 

    try { 
     return inputParser.parse(date); 
    } catch (java.text.ParseException e) { 
     return new Date(0); 
    } 
} 
3

必須比較你的代碼的日期?如果這是項目需求,那麼您可以忽略以下內容。

否則,我認爲您可以使用AlarmManager來創建該功能,而無需實際比較日期。您可以創建一個「啓用」意圖和一個「禁用」意圖,以便AlarmManager在預定時間觸發。類似這樣的:

當用戶確認時間表時註冊您的報警。

Intent intent = new Intent(context, yourAlarmReceiver.class); //or implicit with action 
PendingIntent pIntent = PendingIntent.getBroadcast(
    context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
am.setRepeating (typeConstant, triggerAtMillis, intervalMillis, pIntent); 

你只需要搞清楚什麼triggerAtMillis是確定播出的第一炮,並intervalMillis將是一整天,這是在AlarmManager類的常數。

設置您的自定義接收器類(我寫爲yourAlarmReceiver),它應該擴展BroadcastReceiver,並在您的服務中註冊接收器。在onReceive()中,您應該根據intent.getAction()執行相應的操作。如果您需要更多定製,請不要忘記使用意向過濾器註冊接收器。

@Override 
public void onReceive(Context context, Intent intent) { 
switch(intent.getAction()){ 
case "enable": //enable if not enabled 
case "disable": //disable if not disabled 
default: break; 
} 
} 

通過這種方式,它可以爲您節省一些時間,從今天和明天的比較中掙扎。您可以通過獲取當前系統時間(可能採用24小時格式)確定第一次拍攝的時間,並確定您的預期時間是否已經過去。無論是否已通過,只需將初始觸發時間設置爲currentTime + difference即可。

希望它能揭示出一些光芒。

相關問題