我希望设置警报,以便在触发警报时发送通知。我下面的代码alarmDate.Millisecond
返回0(因为从未设置过)。它应该返回正确的毫秒数才能使警报正常工作-我认为UTC需要花费毫秒级的时间-但在英国,时间必须是格林尼治标准时间(GMT)/夏令时(DST)。
代码:
private void InitBroadcast()
{
// Build the intents
var intent = new Intent(this, typeof(MyReceiver));
var pendingIntent = PendingIntent.GetBroadcast(this, 0, intent, 0);
var alarmManager = (AlarmManager)GetSystemService(AlarmService);
// Build the dates
var currentDate = DateTime.Now;
var alarmDate = new DateTime(currentDate.Year, currentDate.Month, currentDate.Day, 5, 29, 0, DateTimeKind.Local);
// If the alarm time has already past, set the alarm date to tomorrow
if (DateTime.Compare(currentDate, alarmDate) < 0) {
alarmDate.AddDays(1);
}
alarmManager.SetRepeating(AlarmType.RtcWakeup, alarmDate.Millisecond, millisInADay, pendingIntent);
textView.SetText(string.Format("Alarm set for {0}", alarmDate.ToString()), TextView.BufferType.Normal);
}
答案 0 :(得分:0)
毫秒部分,表示为0到999之间的值。
因此alarmDate.Millisecond
不会返回0,因为它从未设置过,而是返回0,因为它被设置为零,所以您使用alarmDate = new DateTime(currentDate.Year, currentDate.Month, currentDate.Day, 5, 29, 0, DateTimeKind.Local);
创建了DateTime对象
您正在将时间设置为当前日期,即上午5:29(0表示秒,因此隐含0表示毫秒)。
alarmDate.Ticks
会给您二十世纪初以来出现的“滴答声”(1 / 10,000毫秒)的数字。但是请记住,SushiHangover在他的评论的so链接中说了什么
Android的AlarmManager基于Android / Linux纪元毫秒
不是.NET DateTime滴答。纪元毫秒是自1970年1月1日格林尼治标准时间00:00:00(1970-01-01 00:00:00 GMT)以来经过的毫秒数。
因此,不要将alarmDate.Millisecond
传递给alarmManager.SetRepeating
方法,而应在当前时间和1970年1月1日午夜GMT之间使用一个TimeSpan来获取历元毫秒,并将其传递给它,例如: / p>
var epochMs = (alarmDate - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
alarmManager.SetRepeating(AlarmType.RtcWakeup, (Int64)epochMs, millisInADay, pendingIntent);