【问题标题】:how to set AlarmManager for specific date, hour, minute and second [duplicate]如何为特定日期、小时、分钟和秒设置 AlarmManager [重复]
【发布时间】:2018-06-29 09:13:11
【问题描述】:

闹钟在指定时间不工作 (2018年12月20日12:10:02)

这段代码有什么问题?

Calendar c = Calendar.getInstance();
c.set(Calendar.MONTH,12);
c.set(Calendar.YEAR,2018);
c.set(Calendar.DAY_OF_MONTH,20);
c.set(Calendar.HOUR_OF_DAY,12);
c.set(Calendar.MINUTE,10);
c.set(Calendar.SECOND,2);

Intent intent = new Intent(ProfileList.this, IntentBroadcastedReceiver.class);
PendingIntent pintent = PendingIntent.getService(ProfileList.this, 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), 30*1000, pintent);

【问题讨论】:

  • 什么不起作用?在标题中您提到了警报管理器,但您的代码仅包含日历实例。您当前的代码中是否缺少某些部分以供我们全面了解?
  • 这里也回答了同样的问题。 stackoverflow.com/questions/3052149/…
  • @RugvedMarathe 这个问题是 8 年前的问题。此后引入了更好的 api。
  • @RugvedMarathe 似乎问题出在设置日历时

标签: java android datetime time java-time


【解决方案1】:

改用java.time api:

LocalDateTime 用于表示日期和时间的组合。

import java.time;

LocalDateTime ldt = LocalDateTime.of(2018, Month.DECEMBER, 20, 12, 10);
// or just parse it from string:
LocalDateTime ldt2 = LocalDateTime.parse("2018-12-20T12:10:00");

// after that, you can get millis for your zone this way:
ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/Los_Angeles"));
long currentTimeMillis = zdt.toInstant().toEpochMilli();

//... your code
alarm.setRepeating(AlarmManager.RTC_WAKEUP, currentTimeMillis, 30*1000, pintent);

请参阅本指南了解数据: http://www.baeldung.com/java-8-date-time-intro

对于早于 26 的 Android,请使用 ThreeTenABP 项目,该项目适应 ThreeTen-Backport 项目,该项目向后移植大部分 java.time Java 6 和 7 的功能。

【讨论】:

    【解决方案2】:

    我知道了,月份从 0 开始。应该是:

    c.set(Calendar.MONTH,11); //December
    

    【讨论】:

    • 为什么不使用 Calendar.DECEMBER?
    • 这是一个,不,这是旧的和过时的Calendar类的两个问题:(1)它使用基于0的月份(2)标准设置当您将月份或任何其他字段设置为无效值时,它不会反对。而是使用java.time。见Viacheslav Shalamov’s answer
    【解决方案3】:

    以下代码对我有用:

     // for Alarm 15/09/2018 at 12.00   
     Calendar myAlarmDate = Calendar.getInstance();
     myAlarmDate.setTimeInMillis(System.currentTimeMillis());
     myAlarmDate.set(2012, 09, 15, 12, 00, 0);
     AlarmManager alarmManager = (AlarmManager)
    
     context.getSystemService(Context.ALARM_SERVICE);
    
     Intent _myIntent = new Intent(context,AlarmReceiverNotificationForEveryMonth.class);
     _myIntent.putExtra("MyMessage","HERE I AM PASSING THEPERTICULAR MESSAGE WHICH SHOULD BE SHOW ON RECEIVER OF ALARM");
     PendingIntent _myPendingIntent = PendingIntent.getBroadcast(context, 123, _myIntent,PendingIntent.FLAG_UPDATE_CURRENT);
     alarmManager.set(AlarmManager.RTC_WAKEUP, myAlarmDate.getTimeInMillis(),_myPendingIntent);
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2014-10-29
      • 2013-07-04
      • 1970-01-01
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      相关资源
      最近更新 更多