检测当前时间是否在两个设置时间之间

时间:2013-04-24 17:41:56

标签: java android date

我有一个包含服务的程序。该程序具有允许用户设置,禁用和启用时间的设置。在这两次之间(如果当然启用了选项),程序应该不起作用。

我实际上很难做到这一点。我已经成功地在几毫秒内转换了“禁用”和“启用”时间。我有以下代码但它没有按预期工作。我想检测当前时间是否在两个设置时间之间,所以我可以在那时禁用服务。

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

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

任何人都能给我更好的暗示吗?

更新

如果用户选择让我们说

  • 禁用小时:15:00
  • 启用小时:22:00

然后代码按预期工作。

但如果用户选择让我们说:

  • 禁用小时:22:00
  • 启用小时:06:00

然后很明显,启用小时是NEXT日。所以我写了下面的代码:

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()得到错误,因为方法todaysDisableDate(Context context)todaysEnableDate(Context context)在第二天(同一天)撤出因为系统小时在)

2 个答案:

答案 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

希望它会有所启发。

答案 1 :(得分: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);
    }
}