我有一个应用程序应该在存储在数据库中的指定时间启动警报。 时间存储为(HH:mm)格式,24小时格式。
这是代码。
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
String temp = h+":"+m;
Date date = sdf.parse(temp);
alarmMgr = (AlarmManager)_c.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(_c, AlarmBroadcastReciever.class);
alarmIntent = PendingIntent.getBroadcast(_c, requestCode, intent, 0);
alarmMgr.set(AlarmManager.RTC_WAKEUP,Calendar.getInstance().getTimeInMillis()+ date.getTime(), alarmIntent);
_c:上下文变量 h是小时(24小时格式),m是分钟。
我想在凌晨4:30发出警报,但它在凌晨03:09:35立即被解雇。
如何在特定时间(无重复)仅安排一次警报?
PS:我倾向于使用警报,因为应用程序需要根据数据库查询在动态时间重复警报。
答案 0 :(得分:2)
int h = 4;
int m = 30;
LocalTime alarmTime = LocalTime.of(h, m);
ZoneId zone = ZoneId.of("Asia/Kolkata");
long alarmTimeMillis = LocalDate.now(zone)
.atTime(alarmTime)
.atZone(zone)
.toInstant()
.toEpochMilli();
System.out.println(alarmTimeMillis);
System.out.println(Instant.ofEpochMilli(alarmTimeMillis));
今天我跑这个时,输出是
1522882800000
2018-04-04T23:00:00Z
要检查1 522 882 800 000的毫秒值是否正确,我将其转换为Instant
。实例始终以UTC格式打印,因此打印时间与亚洲/加尔各答时区的上午4:30(偏移+05:30)一致。您可能希望添加一个检查以查看时间是否已经过去,如果是,则添加一天以便明天在指定时间发生警报。 LocalDate
和其他一些类有plusDays
方法。
如果您将警报时间作为数据库中的04:30
之类的字符串,请按以下方式解析:
String alarmTimeString = "04:30";
LocalTime alarmTime = LocalTime.parse(alarmTimeString);
其余的都一样。
我正在使用并推荐现代Java日期和时间API java.time
。由于SimpleDateFormat
非常麻烦,因此其朋友Date
和Calendar
也已过时。现代API可以更好地使用。
计算闹钟时间有两个错误:
Date
打印,例如Thu Jan 01 04:30:00 IST 1970
,因此看起来正确,这是骗人的。 04:30:00在您当地的时区。当您使用date.getTime()
时,您将获得自纪元以来的毫秒数,并且纪元数以UTC定义,而不是您的时区。例如,我使用亚洲/加尔各答时区,得到毫秒-300万,等于减去 1小时。Calendar.getInstance().getTimeInMillis()
现在给出时间。在此时间内添加毫秒时,您可以指定从现在开始的毫秒数的警报时间 - 在我的示例中为1小时前的警报时间。是的,java.time
适用于较旧和较新的Android设备。它只需要至少Java 6 。
org.threeten.bp
导入日期和时间类。java.time
。java.time
。java.time
向Java 6和7的后端(JST-310的ThreeTen)。