Java 为什么要为重复报警设置星期几;如果今天';星期天怎么样?

Java 为什么要为重复报警设置星期几;如果今天';星期天怎么样?,java,android,date,alarmmanager,repeatingalarm,Java,Android,Date,Alarmmanager,Repeatingalarm,我在android中使用alarmmanager为用户选择的天数设置一个重复警报,这很好,但如果实际的日期是星期天,则不正确。让我看看。如果今天是星期日(7),我将闹钟设置为星期一(8)和星期二(9),当我看到calendar toString()时,配置的日期是7,不要更改,但如果今天是另一天,则只在今天是星期日时才正常工作 calendar.set(Calendar.HOUR_OF_DAY,h) calendar.set(Calendar.MINUTE,m) calendar.set(Cal

我在android中使用alarmmanager为用户选择的天数设置一个重复警报,这很好,但如果实际的日期是星期天,则不正确。让我看看。如果今天是星期日(7),我将闹钟设置为星期一(8)和星期二(9),当我看到calendar toString()时,配置的日期是7,不要更改,但如果今天是另一天,则只在今天是星期日时才正常工作

calendar.set(Calendar.HOUR_OF_DAY,h)
calendar.set(Calendar.MINUTE,m)
calendar.set(Calendar.DAY_OF_WEEK,Calendar.MONDAY)//repeating for Monday if today is Sunday 8, and I set MONDAY, the new date most be Monday 9
Log.d("test",calendar.toString())
发生了什么事?

java.time通过desugaring 考虑使用java.time(现代java日期和时间API)进行日期和时间工作

    LocalTime alarmTime = LocalTime.of(23, 45);
    ZonedDateTime alarmDateTime = ZonedDateTime.now(ZoneId.of("Africa/Porto-Novo"))
            .with(TemporalAdjusters.next(DayOfWeek.MONDAY))
            .with(alarmTime);
    
    System.out.println("Alarm date and time: " + alarmDateTime);
刚刚运行时的输出(2月8日,星期一):

报警日期和时间:2021-02-15T23:45+01:00[非洲/诺和港]

如果您希望警报今天就已经发生,请使用
nextOrSame()
而不是
next()

你的代码出了什么问题? 虽然程序员经常会遇到有关
Calendar
类的许多令人困惑的问题之一,但您遇到了其中两个问题:

  • calendar.set(calendar.DAY/OF\u WEEK,calendar.MONDAY)
    可以将
    calendar
    对象的日期设置为上一个星期一或下一个星期一。它选择哪一个不仅取决于星期几,还取决于
    日历
    对象的设置,这在不同的设备上通常是不同的
  • 下次调用
    calendar.toString()
    时,得到的字符串将不会反映更改星期几后对
    calendar
    对象所做的必要更改。我很快就会想到星期几已经改变了,但是旧的月日值仍然会被打印出来。我不会好好研究文档,给你一个准确的答案。在调用
    get()
    或导致重新计算的其他指定方法之前,
    Calendar
    不会计算其字段
  • 不使用
    日历有很多原因

    问:java.time不需要Android API级别26吗? time在较旧和较新的Android设备上都能很好地工作。它至少需要Java6

    • 在Java8和更高版本以及更新的Android设备上(API级别26),现代API是内置的
    • 在非androidjava6和7中,获取三个后端口,即现代类的后端口(三个十用于jsr310;请参见底部的链接)
    • 在较旧的Android上,可以使用desugaring或Android版本的ThreeTen Backport。它叫ThreeTenABP。在后一种情况下,请确保使用子包从
      org.threeten.bp
      导入日期和时间类
    链接
    • 解释如何使用java.time
    • ,其中首先描述了
      java.time
    • ,java.time的后端口
    到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

  • 如果这是针对Android的,你应该这么说。在这种情况下,你的实际问题是什么?警报器不响了吗?它会引发异常吗@问题是警报没有触发,因为如果今天是星期天,不要更改星期一的日期,但是。。。您明确地将日历设置为星期一,对吗?那么为什么当前的工作日会影响结果呢?是的。但是,如果今天是星期天,不要把它定为星期一。你明白我的意思吗?