日期日期=calendar.getTime(),返回过去的日期



我正在尝试在我的Android应用程序中发送通知。我想在每周的某些日子发送不同的通知。

我已经编写了使用AlarmManager和BroadcastReceiver成功创建通知的代码。我面临的问题是,一旦应用程序运行,通知就会立即运行。我发现这是因为我正在将值传递给以下代码:

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.DAY_OF_WEEK, dayofweek);
calendar.set(Calendar.HOUR_OF_DAY, hourofday);
calendar.set(Calendar.MINUTE, dayminute);
calendar.set(Calendar.SECOND, daysecond);
Date date = calendar.getTime();

例如,假设今天是7月25日星期三。若我在一周中的某一天通过了1,日历。Day_OF_WEEK设置为周日。问题是,当我做calendar.getTime((时,日期设置在过去的7月22日星期日,而不是我预期的下一个星期日(7月29日(。所以现在的情况是,警报管理器正在安排我过去的通知。由于我使用的是alarmManager.set根据安卓开发者的文档,重复通知会立即触发:

"如果所述触发时间在过去,则报警立即触发,报警计数取决于超过触发时间是相对于重复间隔的。">

我的问题是:如何防止calendar.getTime((返回过去的日期,而返回未来的日期?

使用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;
}

尝试使用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);

检查生产日期,如果是过去的日期,则添加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();

如果你能从过时的java.util.Calendar类转移到java 8 java.time.*类,请帮自己一个忙,这样做。我认为Android意味着你不能。

将日历设置为周日并没有像您想象的那样提前日期,而是回到了时间上,这是因为一周的第一天惯例。并非所有文化都认为星期一是一周中的第一天。有些人认为星期天是。有些人也会选择其他日子。

为了让你的日历完全按照你的意愿运行,你必须在自己的惯例中给它定义一周中的第一天是什么,而不是让它自己决定。

所以,在你做其他事情之前,

calendar.setFirstDayOfWeek(Calendar.MONDAY);

那么,程序中的其他内容都是正确的。

最新更新