【问题标题】:Why set DAY_OF_WEEK for repeating alarm don't change date if today's Sunday?如果今天是星期日,为什么设置 DAY_OF_WEEK 重复闹钟不更改日期?
【发布时间】:2021-02-08 02:27:45
【问题描述】:

我在 android 中使用 alarmmanager 为用户选择的日期设置重复警报,这很好,但如果实际日期是星期天,那就不正确了。让我们来看看。如果今天的星期日(7)并且我在看到日历 toString() 时设置了星期一(8)和星期二(9)的闹钟,则配置的日期为 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())

发生了什么事?

【问题讨论】:

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

标签: java android date alarmmanager repeatingalarm


【解决方案1】:

java.time 脱糖

考虑使用现代 Java 日期和时间 API java.time 来处理日期和时间。

    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[Africa/Porto-Novo]

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

你的代码出了什么问题?

虽然程序员遇到关于Calendar 类的许多令人困惑的点之一是很常见的,但您已经遇到了两个

  1. calendar.set(Calendar.DAY_OF_WEEK,Calendar.MONDAY) 可以将Calendar 对象的日期设置为上周一或下周一。它选择哪一个不仅取决于星期几,还取决于 Calendar 对象的设置,这在不同的设备上通常会有所不同。
  2. 下次调用calendar.toString() 时,您获得的字符串将不会反映更改星期几后对Calendar 对象的必要更改。我会立即期望星期几已更改,但仍会打印每月的旧值。我不会很好地研究文档来给你一个准确的答案。 Calendar 不会计算其字段,直到您调用 get() 或其他导致重新计算发生的指定方法。

不使用Calendar的原因有很多。

问题:java.time 不需要 Android API 26 级吗?

java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
  • 在非 Android 的 Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
  • 在较旧的 Android 上,请使用脱糖或 Android 版本的 ThreeTen Backport。它被称为 ThreeTenABP。在后一种情况下,请确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

    猜你喜欢
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    相关资源
    最近更新 更多