2013-04-24 93 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即可。

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

相关问题