我有一个应用程序,它应该在数据库中存储的指定时间触发警报。时间以(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拉响闹钟,但是它在凌晨3:09:35就响了。
如何在特定时间只安排一次警报(不重复)?
PS:我倾向于使用警报,因为应用程序需要在基于数据库查询的动态时间内重复警报。
发布于 2018-04-05 22:36:21
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 800000的毫秒值是否正确,我将其转换为Instant。Instants始终以UTC格式打印,因此打印的时间与亚洲/加尔各答时区的4:30 AM一致(偏移量+05:30)。您可能希望添加一个检查,以查看时间是否已过,如果已过,则添加一天,以便在明天的指定时间发出警报。对于这一点,LocalDate和其他一些类有一个plusDays方法。
如果您从数据库中以类似04:30的字符串形式获得闹钟时间,请按如下方式进行解析:
String alarmTimeString = "04:30";
LocalTime alarmTime = LocalTime.parse(alarmTimeString);其余的都是一样的。
我正在使用并推荐java.time,这是一种现代的Java date and time API。因为SimpleDateFormat是出了名的麻烦,它的朋友Date和Calendar也早就过时了。现代的API使用起来要好得多。
你的代码出了什么问题?
您在计算告警时间时有两个错误:
Date,它打印为例如Thu Jan 01 04:30:00 IST 1970,因此看起来是正确的,这是欺骗性的。4:30:00在你当地的时区。当您使用date.getTime()时,您将获取自纪元以来的毫秒数,并且纪元是以协调时制定义的,而不是以您的时区定义的。例如,我使用亚洲/加尔各答时区,得到的毫秒数是-3 600 000,等于-1 hour.Calendar.getInstance().getTimeInMillis()给出的时间。在将毫秒数添加到此时间时,您可以指定从现在起的毫秒数的警报时间-在我的示例中是1小时前的警报时间。问:我可以在安卓系统上使用java.time吗?
是的,java.time在旧的和新的安卓设备上都能很好地工作。它只需要至少Java 6即可。
从org.threeten.bp导入date和time类
链接
java.time.的java.time安卓版本的java.time的ThreeTen
https://stackoverflow.com/questions/49661237
复制相似问题