java - 如何在Android中检查当前时间是否在未来的时间间隔内?

标签 java android date calendar

我正在处理以下问题。在我的用例中,用户在首次启动应用程序时设置 2 个日期,即 StartSleepingHours 和 StopSleepingHours。

例如,它们可能类似于 StartSleepingHours:Thu 2 Mar 20:00 2017StopSleepingHours: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/

相关文章:

mongodb - 如何查询最长时间段的对象?

java - 单击按钮时隐藏自定义对话框

java - 改变 kNN 算法中的 k 值 - Java

android - android 上是否有接受扩展的浏览器?

android - 多语言安卓应用问题

java - If 语句在 7 小时内出现问题 JAVA 闰年

Java - 不可修改的键集映射

java - Android 服务完全破坏了设备的性能?

android - ListView 崩溃

cocoa-touch - 在特定的小时和分钟为今天创建NSDate