0

我需要根据用户输入的时间和日期来安排任务。这些任务每周重复一次,并且基于复选框值,我需要在那些日子将它们设置为启用。

例如,目前是第六个星期三 15:40 UTC+2。如果用户想在每个星期三的 12:00 安排一个任务,我想在 11 月 13 日的 12:00 获取以毫秒为单位的时间。如果任务设置为每周三16:00,我要今天的时间。计划在每个星期四运行的任务导致明天的毫秒表示。所以,基本上是最接近的日期。我如何在 Java 中实现它?

4

3 回答 3

1

最简单,也可能是最厚颜无耻的答案是使用 Quartz。:)

http://quartz-scheduler.org/

您当然可以编写自己的调度程序,但这不是一项简单的任务。

编辑

要获取日期,您可以使用日历上的 add() 方法。要获取以 ms 为单位的时间,您可以使用 getTimeInMillis() 方法。

如果您想要一种更简单(在我看来,更直观)的方法,您可以使用来自 joda-time ( http://www.joda.org/joda-time/ ) 的 DateTime 类,它更优雅、不可变和时区意识。:)

祝你好运。

于 2013-11-06T13:48:32.730 回答
1

已弃用的Date.getDay()函数解释了如何使用 Calendar 执行此操作。(尽管日期已被弃用,但如果您真的想使用它,它仍然有效)。

Calendar.get(Calendar.DAY_OF_WEEK);

在流程方面,您将有一个类用于将事件的星期几存储为 int 和时间。

然后,您将针对以下内容评估今天的日期和时间:

  1. 评估今天是否是一周中的指定日期。如果是,请检查时间是否已经过去。如果还没有,请合理安排今天的时间。如果有,请将日历日期添加 7 天以获得预期日期。
  2. 否则,如果预定的星期几在星期几之前:从 7 中减去这两天之间的差。(即,如果目标日期是星期日 (0) 而今天是星期三 (3),则 7 - (3 - 0) = 4,因此在今天的日期加上 4 天得到目标日期)
  3. 如果是之后,只需计算这两天之间的差(即如果目标日期是星期六(6)而今天是星期三(3),6 - 3 = 3,因此在今天的日期上加上 3 天得到目标日期) .

您可能还需要检查 DST。

于 2013-11-06T14:16:52.883 回答
0

谢谢回答。Compass 的回答是正确的,我在 Java 中创建了以下实现:

public static long nextDate(int day, int hour, int minute) {
    // Initialize the Calendar objects
    Calendar current = Calendar.getInstance();
    Calendar target  = Calendar.getInstance();

    // Fetch the current day of the week. 
    // Calendar class weekday indexing starts at 1 for Sunday, 2 for Monday etc. 
    // Change it to start from zero on Monday continueing to six for Sunday
    int today = target.get(Calendar.DAY_OF_WEEK) - 2;
    if(today == -1) today = 7;

    int difference = -1;
    if(today <= day) {
        // Target date is this week
        difference = day - today;
    } else {
        // Target date is passed already this week.
        // Let's get the date next week
        difference = 7 - today + day;
    }

    // Setting the target hour and minute
    target.set(Calendar.HOUR_OF_DAY, hour);
    target.set(Calendar.MINUTE, minute);
    target.set(Calendar.SECOND, 0);

    // If difference == 0 (target day is this day), let's check that the time isn't passed today. 
    // If it has, set difference = 7 to get the date next week
    if(difference == 0 && current.getTimeInMillis() > target.getTimeInMillis()) {
        difference = 7;
    }

    // Adding the days to the target Calendar object
    target.add(Calendar.DATE, difference);

    // Just for debug
    System.out.println(target.getTime());

    // Return the next suitable datetime in milliseconds
    return target.getTimeInMillis();
}
于 2013-11-06T15:19:09.177 回答