为当前或未来日期设置警报

时间:2014-10-22 11:37:26

标签: java android date alarmmanager

我目前正在从数据库中获取日期格式,其格式为HH:mm,例如10:00。

然后我改变时间格式,以便它可以在milis中设置重复警报:

SimpleDateFormat format = new SimpleDateFormat("HH:mm");
String time = collectionString;

long timeOfFirstCollectionInMillis = format.parse(time).getTime();
System.out.println(collectionInMillis);

//Set Alarm to Repeat
manager.setRepeating(AlarmManager.RTC_WAKEUP,collectionInMillis, interval, pendingIntent);

问题是它认为日期已经过去,因为当时没有附加日期(我认为)。我如何设置它,以便如果时间已经过去,比如上午11:00,但时间应该是上午10:00,将其设置为将来的日期,如果时间是上午9:00但是时间是当前日期的上午10点?

3 个答案:

答案 0 :(得分:1)

我会使用Calendar类来实现此目的。所以基本上:
- 将时间设置为日历,并将日期设置为今天 - 将其与当前时间戳进行比较
- 如果它在当前时间之前,则将其设置为将来的日期(下一个小时,第二天,......) - 如果是在当前时间之后,您可以按原样使用它

粗略地说:

Calendar now = Calendar.getInstance();
now.setTime(new Date());

Calendar cal = Calendar.getInstance();
cal.setTime(timeOfFirstCollectionInMillis);
cal.set(Calendar.YEAR, now.get(Calendar.YEAR));

每月和每天都这样做......然后:

if (cal.before(now)) {
   // increase
} else {
  timeOfFirstCollectionInMillis = cal.getTime();
}

答案 1 :(得分:0)

我猜这里的输出时间可能是24小时格式,比如晚上11点可能是23:00。

希望这有帮助。

答案 2 :(得分:0)

约达时间

这是与other answer by Carsten中相同类型的代码,但使用的是Joda-Time库。这个答案基本上有效,但没有考虑时区的关键问题。 java.util.Date / .Calendar类非常麻烦,应该避免使用。

LocalTime time = LocalTime.parse( "10:00" );
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zone );
DateTime target = now.withTime( now.getHourOfDay(), now.getMinuteOfHour(), now.getSecondOfMinute(), now.getMillisOfSecond() );
if ( target.isBefore( now ) ) {
    target = target.plusDays( 1 );
}
Duration duration = new Duration( now, target );
long millisUntilTarget = duration.getMillis();

在实际工作中,我会添加一些填充。如果millisUntilTarget是一个非常小的数字,那么在应用程序的其余部分发出警报之前可能会持续很短的持续时间。