2017-03-03 64 views
1

我正在处理以下问题。在我的用例中,用户首次启动应用程序时设置了两个日期,即StartSleepingHours和StopSleepingHours。如何在Android中检查当前时间是否与未来有间隔?

例如,它们可能看起来像StartSleepingHours:Thu 2 Mar 20:00 2017StopSleepingHours:Thu 2 Mar 8:00 2017(注意它们是在用户设置日期之后的同一日期)。现在,我的问题是,我有一个定期任务,每15分钟运行一次以检查是否在StartSH和StopSH间隔之间确定是否启动活动监视服务。

显然,我不希望我的服务在睡觉时监视用户的活动。目前,我试图从StartSH和StopSH中仅提取小时和分钟信息,并从中创建日期对象以便与现在进行比较,但我非常困惑和沮丧如何检查现在是否在间隔内开始/在将来停止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"); 
    } 

} 

控制台显示不睡觉个小时,但我认为它应该说休息时间9:30以前

+1

有isBefore和isAfter方法。你试过了吗? –

+0

@VladMatvienko哈:D这是新的日期():) –

+0

@ cricket_007我认为日期类只有在(日期日期)和befor(日期日期)之后,我在示例中使用 –

回答

3

如果我理解正确,你只关心小时/分钟,所以你可以检查当前小时是否在提供的范围内用户在这种情况下,检查是否分钟数内分钟不等

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; 
    } 
} 

但我会失去日期(您使用的是过时的方法),并使用jodatime库,而不是这个question应该可以得出较为清淡关于使用yodatime或任何其他第三方库的优缺点

+0

谢谢你的回答。然而。该方法未能通过上面的主要方法进行检查:/我在9:37调用方法,并将StopSH限制设置为9:40,因此它应该有说睡眠时间仍然 –

+1

它失败,因为您将hour_of_day设置为40而不是分钟;),使日期为3月05日16:00 –

+0

对不起。我纠正了测试方法,但仍然失败:/ –

相关问题