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

时间:2018-07-26 11:54:14

标签: java android

我正在尝试获取要在我的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()返回过去的日期而改为返回将来的日期?

4 个答案:

答案 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);

然后,程序中的所有其他内容都是正确的。