我正在尝试获取要在我的Android应用中发送的通知。我想在一周中的某些天每周发送不同的通知。
我已经编写了使用AlarmManager和BroadcastReceiver成功创建通知的代码。我面临的问题是,通知会在应用程序运行后立即运行。我发现这是因为我正在将值传递给以下代码:
<div id="app">
<div v-for="(item, index) in items">
{{item.name}}
<input type="checkbox" :value="item.price" v-model="checkedValue" :key="index">
<input type="number" v-model="amount[index]">
</div>
{{totalPrice}}
</div>
例如,假设今天是7月25日,星期三。如果我在dayofweek传递1,Calendar.Day_OF_WEEK将设置为星期日。问题是当我执行calendar.getTime()时,日期设置为过去的7月22日星期日,而不是我期望的下一个星期日(7月29日)。因此,发生的事情是警报管理器过去调度了我的通知。由于我正在使用alarmManager.setRepeating,因此根据Android Developers documentation,该通知将立即触发,其中指出:
”如果指定的触发时间是过去的时间,则警报将是 立即触发,并根据在多远处发出警报计数 超过触发时间是相对于重复间隔的。”
我的问题是这样的:如何防止calendar.getTime()返回过去的日期而改为返回将来的日期?
答案 0 :(得分:1)
使用Calendar.add()
方法将确保其他字段(如DAY_OF_MONTH,MONTH等)正确翻转。您只需要将固定的dayOfWeek
值转换为今天和那天之间的差额即可:
calendar.add(Calendar.DAY_OF_WEEK, (dayOfWeek - calendar.get(Calendar.DAY_OF_WEEK) + 7) % 7);
请注意,这不考虑时间,即当您将其指定为今天的工作日时,而是过去的时间,结果仍然是过去的时间。为确保结果始终在将来,请在设置值之后进行检查:
public static Calendar getClosestFutureWeekday(int dayOfWeek, int hour, int minute, int second)
{
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, second);
if (calendar.before(Calendar.getInstance()))
{
calendar.add(Calendar.DAY_OF_MONTH, 7);
}
return calendar;
}
答案 1 :(得分:0)
尝试使用Date类设置日期。以下是获取现在和一周前一周的日期的示例。
使用 cal.add(); 会将日期添加到日历中,而不是使用 cal.set();
从今天开始一周:
Date today = Calendar.getInstance().getTime();
Calendar cal = Calendar.getInstance();
cal.setTime(today);
cal.add(Calendar.DATE, 7);
一周前:
Date today = Calendar.getInstance().getTime();
Calendar cal = Calendar.getInstance();
cal.setTime(today);
cal.add(Calendar.DATE, -7);
答案 2 :(得分:0)
检查日期,然后再加上7天:
Long currentDateTime = System.currentTimeMillis();
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(currentDateTime);
calendar.set(Calendar.DAY_OF_WEEK, dayofweek);
calendar.set(Calendar.HOUR_OF_DAY, hourofday);
calendar.set(Calendar.MINUTE, dayminute);
calendar.set(Calendar.SECOND, daysecond);
if (calendar.getTimeInMillis() < currentDateTime) {
calendar.add(Calendar.DAY_OF_MONTH, 7);
}
Date date = calendar.getTime();
答案 3 :(得分:0)
如果您可以从过时的java.util.Calendar转到Java 8 java.time。*类,请帮自己一个忙。我假设Android意味着你做不到。
之所以将日历设置为“星期日”,并不像您想象的那样提前日期,而是将时间倒退,原因是因为一周的第一天。并非所有文化都认为星期一是一周的第一天。有些人相信星期天是。其他人也需要几天的时间。
要使日历的行为完全符合您的要求,您必须根据自己的约定定义日历的第一天是星期几,而不是让日历自行决定。
因此,在您执行其他操作之前,
calendar.setFirstDayOfWeek(Calendar.MONDAY);
然后,程序中的所有其他内容都是正确的。