Android 以正确的方式设置警报

Android 以正确的方式设置警报,android,alarmmanager,Android,Alarmmanager,我正在使用API获取Android应用程序的电影版本,发布日期以UTC毫秒为单位。当我把发布日期设定在用户的手机上时,它会在他的时区转换并被呼叫 示例: 电影的发行日期(毫秒): 1509667200000 到UTC时间和日期: 2017年11月3日星期五00:00:00 至当地时间和日期:(东部时间,我的时区) 2017年11月2日星期四20:00:00 当我设置闹钟时 Calendar calendar = Calendar.getInstance(); calendar.s

我正在使用API获取Android应用程序的电影版本,发布日期以UTC毫秒为单位。当我把发布日期设定在用户的手机上时,它会在他的时区转换并被呼叫

示例:

电影的发行日期(毫秒):

1509667200000

到UTC时间和日期:

2017年11月3日星期五00:00:00

至当地时间和日期:(东部时间,我的时区)

2017年11月2日星期四20:00:00

当我设置闹钟时

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(releaseDate);
    Date date = calendar.getTime();
    alarmManager.set(AlarmManager.RTC_WAKEUP, date.getTime(), alarmIntent);
警报会在2017年11月2日20:00:00被调用,但它需要在11月3日午夜被调用


谢谢

您能试着将时区设置为UTC吗

calendar.setTimeZone(TimeZone.getTimeZone("UTC"));

我所做的和现在它完美地工作:

    // Calendar
    TimeZone timeZone = TimeZone.getTimeZone("UTC");
    Calendar calendar = Calendar.getInstance(timeZone);
    calendar.setTimeInMillis(releaseDate);
    Date date = calendar.getTime();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, date.getTime(), pendingIntent);
    } else {
        alarmManager.set(AlarmManager.RTC_WAKEUP, date.getTime(), pendingIntent);
    }

我已经工作了好几天了。 我已经完成了学校课程表的报警模块。 我所做的是

@Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

            Calendar calNow = Calendar.getInstance();
            Calendar calSet = (Calendar) calNow.clone();

            calSet.set(Calendar.HOUR_OF_DAY, hourOfDay);
            calSet.set(Calendar.MINUTE, minute);
            calSet.set(Calendar.SECOND, 0);
            calSet.set(Calendar.MILLISECOND, 0);

            if(calSet.compareTo(calNow) <= 0){
                //Today Set time passed, count to tomorrow
                calSet.add(Calendar.DATE, 1);
            }

            setAlarm(calSet);
        }};

    private void setAlarm(Calendar targetCal){

        textAlarmPrompt.setText(
                "\n\n***\n"
                + "Alarm is set@ " + targetCal.getTime() + "\n"
                + "***\n");

        Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RQS_1, intent, 0);
        AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
//      alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(),AlarmManager.INTERVAL_DAY, pendingIntent);
    }
@覆盖
时间集上的公共void(时间选择器视图,整数小时日,整数分钟){
Calendar calNow=Calendar.getInstance();
Calendar calSet=(Calendar)calNow.clone();
calSet.set(日历小时/天,小时/天);
calSet.set(Calendar.MINUTE,MINUTE);
calSet.set(日历秒,0);
calSet.set(日历毫秒,0);

如果(calSet.compareTo)(calNow),我认为您应该使用
setExact()
而不是
set()
来处理
alarmManager
。查看此文档您是否在没有
timeZone
的情况下尝试过?是的,结果相同