Android 报警管理器意外广播
我有一个应用程序,它应该在数据库中存储的指定时间触发警报。 时间以(HH:mm)格式存储,24小时格式 这是代码Android 报警管理器意外广播,android,alarmmanager,unix-timestamp,milliseconds,Android,Alarmmanager,Unix Timestamp,Milliseconds,我有一个应用程序,它应该在数据库中存储的指定时间触发警报。 时间以(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 = ne
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:我倾向于使用报警,因为应用程序需要根据数据库查询在动态时间重复报警
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的毫秒值是否正确,我将其转换为一个即时。瞬间始终以UTC打印,因此打印的时间与亚洲/加尔各答时区的凌晨4:30一致(偏移量+05:30)。您可能需要添加一个检查,以查看时间是否已过,如果已过,请添加一天,以便在明天的指定时间发出警报LocalDate
和其他一些类有一个plusDays
方法
如果从数据库中以字符串形式获取报警时间,如04:30
,请按如下方式解析:
String alarmTimeString = "04:30";
LocalTime alarmTime = LocalTime.parse(alarmTimeString);
其余的都一样
我正在使用并推荐java.time
,这是一种现代的java日期和时间API。因为SimpleDateFormat
是出了名的麻烦,它的朋友Date
和Calendar
也早已过时。现代的API非常好用
你的代码出了什么问题?
计算报警时间时有两个错误:
虽然您的解析生成一个日期
,该日期打印为例如Thu Jan 01 04:30:00 IST 1970
,因此看起来是正确的,但这是欺骗。04:30:00在您当地的时区。当您使用date.getTime()
时,您将获得自历元以来的毫秒数,历元是以UTC定义的,而不是在时区中定义的。例如,我使用亚洲/加尔各答时区,得到的毫秒数为-360000,等于-1小时
Calendar.getInstance().getTimeInMillis()
给出现在的时间。将毫秒数添加到此时间中时,指定一个从现在开始的毫秒数的报警时间-在我的示例中是1小时前的报警时间
问题:我可以在Android上使用java.time吗?
是的,java.time
在较旧和较新的Android设备上运行良好。它至少需要Java6
- 在Java8和更高版本以及更新的Android设备上,内置了现代API
- 在Java6和Java7中,获取三个后端口,即新类的后端口(三个用于JSR310;请参阅底部的链接)
- 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保从带有子包的
org.threeten.bp
导入日期和时间类
链接
- 解释如何使用
java.time
- ,其中首先描述了
java.time
- ,java.time的后端口
到Java6和Java7(JSR-310为三十)
,Android版Three Ten Backport
,解释得非常透彻
当我今天运行这个时,输出是
1522882800000
2018-04-04T23:00:00Z
为了检查1 522 882 800 000的毫秒值是否正确,我将其转换为一个即时。瞬间始终以UTC打印,因此打印的时间与亚洲/加尔各答时区的凌晨4:30一致(偏移量+05:30)。您可能需要添加一个检查,以查看时间是否已过,如果已过,请添加一天,以便在明天的指定时间发出警报LocalDate
和其他一些类有一个plusday
方法
如果从数据库中以字符串形式获取报警时间,如04:30
,请按如下方式解析:
String alarmTimeString = "04:30";
LocalTime alarmTime = LocalTime.parse(alarmTimeString);
其余的都一样
我正在使用并推荐java.time
,这是一种现代的java日期和时间API。因为SimpleDateFormat
是出了名的麻烦,它的朋友Date
和Calendar
也早已过时。现代的API非常好用
你的代码出了什么问题?
计算报警时间时有两个错误:
虽然您的解析生成一个日期
,该日期打印为例如Thu Jan 01 04:30:00 IST 1970
,因此看起来是正确的,但这是欺骗。04:30:00在您当地的时区。当您使用date.getTime()
时,您将获得自历元以来的毫秒数,历元是以UTC定义的,而不是在时区中定义的。例如,我使用了亚洲/加尔各答时区,得到的毫秒数为-360000,等于-1小时
Calendar.getInstance().getTimeInMillis()
给出现在的时间。将毫秒数添加到此时间中时,指定一个从现在开始的毫秒数的报警时间-在我的示例中是1小时前的报警时间
问题:我可以在Android上使用java.time吗?
是的,java.time
在较旧和较新的Android设备上运行良好。它至少需要Java6
- 在Java8和更高版本以及更新的Android设备上,内置了现代API
- 在Java6和Java7中,获取三个后端口,即新类的后端口(三个用于JSR310;请参阅底部的链接)
- 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保从带有子包的
org.threeten.bp
导入日期和时间类
链接
- 解释如何使用
java.time
- ,其中首先描述了
java.time
- ,java.time的后端口
到Java6和Java7(JSR-310为三十)
,Android版Three Ten Backport
,解释得非常透彻
这部分是时间地带