[英]Setting up alarm for current or future date
我目前正在從數據庫中獲取日期格式,其格式為HH:mm,例如10:00。
然后,我更改時間格式,以便可以設置重復警報的時間:
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 am,但時間應該是10:00 am,則將其設置為將來的日期,如果時間是9:00 am,但時間是當前日期上午10:00?
我將為此使用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();
}
我猜這里的輸出時間可能是24小時格式,例如晚上11:00,可能是23:00。
希望這可以幫助。
這與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是一個非常小的數字,那么可能會在應用程序的其余部分發出警報之前經過很短的持續時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.