Java 如何在Alarmmanger上设置日期?

Java 如何在Alarmmanger上设置日期?,java,android,date,calendar,alarmmanager,Java,Android,Date,Calendar,Alarmmanager,我试过这个代码在三月一号报警。 但它不起作用。 我怎样才能解决这个问题 应用程序内容 当我们按下按钮(单击1)时,如果是在三月一日,Alarmmanger会调用intent。 所以这个应用程序打印新的活动 错误 当我们按下按钮(单击1)时,AlarmManager随时调用intent 我怎样才能解决它 -对不起,我的英语不好。。ㅠㅠ public class MainActivity extends Activity { private AlarmManager alarm; pri

我试过这个代码在三月一号报警。 但它不起作用。 我怎样才能解决这个问题

应用程序内容


当我们按下按钮(单击1)时,如果是在三月一日,Alarmmanger会调用intent。 所以这个应用程序打印新的活动


错误


当我们按下按钮(单击1)时,AlarmManager随时调用intent


我怎样才能解决它

-对不起,我的英语不好。。ㅠㅠ

public class MainActivity extends Activity {

private AlarmManager alarm;

private NotificationManager notification;
Calendar calendar = Calendar.getInstance();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);}
    public void click1(View v) {
    notification = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
    alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    Calendar cal = new GregorianCalendar();
    cal.setTimeInMillis(System.currentTimeMillis());


    calendar.clear();
    calendar.set(cal.YEAR,3,1);


    setAlarm();
    }



private void setAlarm(){

alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent());


}
private PendingIntent pendingIntent() {
    // TODO Auto-generated method stub
    Intent i = new Intent(getApplicationContext(), MainActivity.class);
    PendingIntent p = PendingIntent.getActivity(this, 0, i, 0);
    return p;

}

您无需创建另一个日历即可获得实际年份。
当您请求一个新的日历实例时,它将用实际的日期和时间初始化 试试这个:

Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
calendar.set(year,Calendar.MARCH,1);
还有一件事,如果您将闹钟设置为过去时间,闹钟总是会响。

tl;博士 避免旧的日期时间类 您正在使用旧的遗留日期时间类。现在被java.time类取代

LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

LocalDate ld = LocalDate.of( 2016 , Month.MARCH , 1 );
您可以传递一个数字,而不是一月到十二月编号为1-12的
Month
enum对象

时区 为了报警,我们需要一天中的某个时间。你可以得到一天中的第一刻。这通常是时间
00:00:00
,但并不总是由于夏令时(DST)或其他异常。让java.time确定时间

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,法国巴黎午夜过后几分钟是新的一天,而魁北克山仍然是“昨天”

ZoneDateTime
应用一个
ZoneId
,以获得一个

如果报警库要求将该时刻表示为自1970 UTC开始以来的毫秒计数,则从提取的对象中查询
long
整数

关于java.time 该框架内置于Java8及更高版本中。这些类取代了旧的麻烦的日期时间类,如
java.util.date
.Calendar
,&
java.text.SimpleDateFormat

该项目现已启动,建议迁移到java.time

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释

大部分java.time功能都在中向后移植到java 6和7,并进一步适应于中(请参阅)


该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如
Interval
YearWeek
YearQuarter
,等等。

这可能不是您的问题,但三月值是2。为避免此类错误,请使用日历常量,在本例中为
Calendar.MARCH
什么不起作用?编辑你的问题,试着更好地解释问题哦!我错过了最后一句话!很高兴帮助你。如果你的问题得到解决,你必须接受这一点作为答案。
LocalDate ld = LocalDate.of( 2016 , Month.MARCH , 1 );
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
long millisecondsSinceEpoch = zdt.toInstant().toEpochMilli() ;