我正在处理以下问题。在我的用例中,用户在首次启动应用程序时设置 2 个日期,即 StartSleepingHours 和 StopSleepingHours。
例如,它们可能类似于 StartSleepingHours:Thu 2 Mar 20:00 2017
和 StopSleepingHours:Thu 2 Mar 8:00 2017
(请注意,它们是相同的日期,因为这是用户设置的日期)。现在,我的问题是我有一个定期任务,每 15 分钟运行一次,检查 Now 是否在 StartSH 和 StopSH 间隔之间,以确定是否启动 Activity 监控服务。
显然,我不希望我的服务在用户 sleep 时监视用户的 Activity 。目前,我试图从 StartSH 和 StopSH 中仅提取小时和分钟信息,并从中创建日期对象,以便将它们与现在进行比较,但我对如何检查现在是否在间隔 Start/内感到非常困惑和沮丧以后别再SH了。
目前我的代码是这样的:
public static boolean isWithinSH(Date startSH, Date now, Date stopSH) {
boolean isSH = false;
Calendar calendar = Calendar.getInstance(Locale.UK);
calendar.set(Calendar.HOUR_OF_DAY, startSH.getHours());
calendar.set(Calendar.MINUTE, startSH.getMinutes());
Date sameDayStartSH = calendar.getTime();
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
Date midnight = calendar.getTime();
calendar.add(Calendar.DAY_OF_WEEK, 1);
calendar.set(Calendar.HOUR_OF_DAY, stopSH.getHours());
calendar.set(Calendar.MINUTE, stopSH.getMinutes());
Date currentStopSH = calendar.getTime();
if (now.before(midnight) && now.after(sameDayStartSH)) {
System.out.println("SLEEPING HOURS");
isSH = true;
} else if (now.after(midnight) && now.before(currentStopSH)) {
System.out.println("SLEEPING HOURS");
isSH = true;
} else {
System.out.println("NOT SLEEPING HOURS");
}
return isSH;
}
我正在尝试在Java环境中测试该方法,如下所示:
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance(Locale.UK);
calendar.add(Calendar.DAY_OF_WEEK, -1);
calendar.set(Calendar.HOUR_OF_DAY, 20);
calendar.set(Calendar.MINUTE, 0);
Date StartSH = calendar.getTime();
calendar.add(Calendar.DAY_OF_WEEK, 2);
calendar.set(Calendar.HOUR_OF_DAY, 9);
calendar.set(Calendar.MINUTE, 45);
Date StopSH = calendar.getTime();
Date now = new Date(); // 9:42
if (isWithingSH(StartSH, now, StopSH)) {
System.out.println("SPEEPING HOURS");
} else {
System.out.println("NOT SPEEPING HOURS");
}
}
控制台显示“NOT SLEEPING HOURS”,但我认为它应该显示“SLEEPING HOURS”,因为它是在 9:30 之前
最佳答案
如果我理解正确的话,你只关心小时/分钟,所以你可以检查当前小时是否在用户提供的范围内,在这种情况下检查分钟是否在分钟范围内
public static boolean isWithingSH(Date startSH, Date now, Date stopSH) {
try {
SimpleDateFormat parser = new SimpleDateFormat("HH:mm", Locale.UK);
Date startTime = parser.parse(startSH.getHours() + ":" + startSH.getMinutes());
Date endTime = parser.parse(stopSH.getHours() + ":" + stopSH.getMinutes());
Date nowTime = parser.parse(now.getHours() + ":" + now.getMinutes());
if(startTime.after(endTime)) {
if(endTime.after(nowTime)) {
return true;
} else {
return false;
}
} else {
if (startTime.before(nowTime) && endTime.after(nowTime)){
return true;
} else {
return false;
}
}
} catch (java.text.ParseException e) {
return false;
}
}
但是我会丢失 Date (您使用的方法已被弃用)并使用 jodatime 库来代替这个 question希望能够更多地说明使用 yodatime 或任何其他 3rd 方库的优点/缺点
关于java - 如何在Android中检查当前时间是否在未来的时间间隔内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42574433/