我有一个包含服务的程序。该程序具有允许用户设置,禁用和启用时间的设置。在这两次之间(如果当然启用了选项),程序应该不起作用。
我实际上很难做到这一点。我已经成功地在几毫秒内转换了“禁用”和“启用”时间。我有以下代码但它没有按预期工作。我想检测当前时间是否在两个设置时间之间,所以我可以在那时禁用服务。
public boolean isCurrentTimeBetween_enableDisable() {
long sysTime = System.currentTimeMillis();
if((sysTime > disableTime && sysTime < enableTime)) {
return true;
}
return false;
}
任何人都能给我更好的暗示吗?
更新
如果用户选择让我们说
然后代码按预期工作。
但如果用户选择让我们说:
然后很明显,启用小时是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)
在第二天(同一天)撤出因为系统小时在)
答案 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);
}
}