xamarin SetAlarm上一个DateTime

问题描述 投票:0回答:1

我想,这样它发送每当警报被触发的通知设置报警。下面的代码,我有,在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);
    }
xamarin xamarin.android
1个回答
0
投票

检查文档:https://docs.microsoft.com/en-us/dotnet/api/system.datetime.millisecond?view=netframework-4.7.2#System_DateTime_Millisecond

毫秒部件,表示为0到999之间的值。

所以,因为它从来没有alarmDate.Millisecond不返回0,则返回0,因为它被设置为零,那么你alarmDate = new DateTime(currentDate.Year, currentDate.Month, currentDate.Day, 5, 29, 0, DateTimeKind.Local);创建的DateTime对象

请参阅:https://docs.microsoft.com/en-us/dotnet/api/system.datetime.-ctor?view=netframework-4.7.2#System_DateTime__ctor_System_Int32_System_Int32_System_Int32_System_Int32_System_Int32_System_Int32_System_DateTimeKind_

您正在设置时间为当前日期在上午5点29分(与0秒,所以0毫秒暗示)。

alarmDate.Ticks会给你,因为二十一世纪初已经过去的“滴答”(一毫秒的1 / 10,000)的红棕色。但千万记住什么SushiHangover在他的评论中这样说链接

Android的AlarmManager是基于安卓/ Linux的毫秒为单位

不是.NET日期时间刻度。毫秒为单位的自1970年1月1日,在00:00:00 GMT(1970-01-01 00:00:00 GMT)以来经过的毫秒数。

因此,而不是在alarmDate.Millisecond传递给alarmManager.SetRepeating方法,使用当前时间和1970年1月1日午夜GMT之间的时间跨度,以获得毫秒为单位,并把它传递代替,例如:

var epochMs = (alarmDate - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
alarmManager.SetRepeating(AlarmType.RtcWakeup, (Int64)epochMs, millisInADay, pendingIntent);
© www.soinside.com 2019 - 2024. All rights reserved.