我需要根据用户输入的时间和日期来安排任务。这些任务每周重复一次,并且基于复选框值,我需要在那些日子将它们设置为启用。
例如,目前是第六个星期三 15:40 UTC+2。如果用户想在每个星期三的 12:00 安排一个任务,我想在 11 月 13 日的 12:00 获取以毫秒为单位的时间。如果任务设置为每周三16:00,我要今天的时间。计划在每个星期四运行的任务导致明天的毫秒表示。所以,基本上是最接近的日期。我如何在 Java 中实现它?
最简单,也可能是最厚颜无耻的答案是使用 Quartz。:)
您当然可以编写自己的调度程序,但这不是一项简单的任务。
编辑
要获取日期,您可以使用日历上的 add() 方法。要获取以 ms 为单位的时间,您可以使用 getTimeInMillis() 方法。
如果您想要一种更简单(在我看来,更直观)的方法,您可以使用来自 joda-time ( http://www.joda.org/joda-time/ ) 的 DateTime 类,它更优雅、不可变和时区意识。:)
祝你好运。
已弃用的Date.getDay()函数解释了如何使用 Calendar 执行此操作。(尽管日期已被弃用,但如果您真的想使用它,它仍然有效)。
Calendar.get(Calendar.DAY_OF_WEEK);
在流程方面,您将有一个类用于将事件的星期几存储为 int 和时间。
然后,您将针对以下内容评估今天的日期和时间:
您可能还需要检查 DST。
谢谢回答。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();
}