我正在尝试在特定日期发送通知。我的方法“ setNextNotification”使用AlarmManager计划下一个通知。

Java Time API用于检查当天。如果等于星期二,则将一天添加到ZonedDateTime中,并将警报设置为该天。至少这是我要完成的工作。

今天是星期二,无论如何都会发出通知。

我想念什么?

private static void setNextNotification(Context context) {
        LocalDateTime ldt = LocalDateTime.now();
        ZonedDateTime zdt = ldt.atZone(ZoneId.of("Europe/Stockholm"));
        DayOfWeek dayOfWeek = zdt.getDayOfWeek();

        Intent intent = new Intent(context, ReminderReceiver.class);
        PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

        if(dayOfWeek.getValue() == 2){
            zdt.plusDays(1);
            alarmManager.set(AlarmManager.RTC_WAKEUP, zdt.toInstant().toEpochMilli(), alarmIntent);
        }

    }

最佳答案

ZonedDateTime是带有时区的日期时间的不变表示。因此,即使您调用了plusDays(1)ZoneDateTime对象中的原始时间也保持不变。

plusDays()返回具有修改后值的新ZonedDateTime对象。您没有在代码中分配哪一个。所以你需要更换

zdt.plusDays(1);zdt = zdt.plusDays(1);

为了使其按预期工作。

修改后的代码:

private static void setNextNotification(Context context) {
        LocalDateTime ldt = LocalDateTime.now();
        ZonedDateTime zdt = ldt.atZone(ZoneId.of("Europe/Stockholm"));
        DayOfWeek dayOfWeek = zdt.getDayOfWeek();

        Intent intent = new Intent(context, ReminderReceiver.class);
        PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

        if(dayOfWeek.getValue() == 2){
            zdt = zdt.plusDays(1);
            alarmManager.set(AlarmManager.RTC_WAKEUP, zdt.toInstant().toEpochMilli(), alarmIntent);
        }

}

10-07 12:13