1

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

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

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

那么很明显,启用时间是下一天。所以我写了以下代码:

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)第二天退出(与系统时间相同的那一天)

4

2 回答 2

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.

希望它会有所启发。

于 2013-04-24T19:32:41.920 回答
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);
    }
}
于 2013-04-24T18:58:07.887 回答