Java 第二天X在Y
我需要根据用户输入的时间和天数安排任务。这些任务每周重复一次,根据复选框值,我需要在这些天启用它们Java 第二天X在Y,java,date,calendar,Java,Date,Calendar,我需要根据用户输入的时间和天数安排任务。这些任务每周重复一次,根据复选框值,我需要在这些天启用它们 例如,现在是星期三,第六个15:40 UTC+2。如果用户希望将任务安排在每周三的12:00,我希望获得11月13日12:00的时间(以毫秒为单位)。如果任务安排在每个星期三16:00,我想要今天的时间。计划在每周四运行的任务将产生明天的毫秒表示。所以,基本上是最接近的日期。如何在Java中实现这一点?最简单、也许也是最厚颜无耻的答案是使用Quartz.) 当然,您可以编写自己的调度程序,但这不
例如,现在是星期三,第六个15:40 UTC+2。如果用户希望将任务安排在每周三的12:00,我希望获得11月13日12:00的时间(以毫秒为单位)。如果任务安排在每个星期三16:00,我想要今天的时间。计划在每周四运行的任务将产生明天的毫秒表示。所以,基本上是最接近的日期。如何在Java中实现这一点?最简单、也许也是最厚颜无耻的答案是使用Quartz.) 当然,您可以编写自己的调度程序,但这不是一项简单的任务 编辑 要获取日期,可以在日历上使用add()方法。 要以毫秒为单位获取时间,可以使用getTimeInMillis()方法 如果您想要一种更简单(我个人认为,更直观)的方法,您可以使用joda time()中的DateTime类,它更优雅、不可变且具有时区意识。:) 祝你好运。不推荐使用的函数解释了如何使用日历进行此操作。(尽管Date已被弃用,但如果您确实想使用它,它仍然有效)
Calendar.get(Calendar.DAY/OF/u-WEEK)代码>
在流程方面,您将有一个类用于将事件的一周中的某一天存储为int,以及时间
然后,您将对今天的日期和时间进行以下评估:
评估今天是否为一周中的指定日期。
如果是,检查时间是否已经过去。
如果还没有,那么在当时合理地安排今天。
如果有,则在日历日期上添加7天以获得预期日期
否则,如果一周中的计划日期早于一周中的今天:
用7减去两天之间的差值。(即,如果目标日期是星期日(0),而今天是星期三(3),则7-(3-0)=4,因此在今天的日期上加上4天以获得目标日期)
如果是在之后,只需计算两天之间的差值(即,如果目标日期是星期六(6)而今天是星期三(3),6-3=3,因此在今天的日期上加上3天即可获得目标日期)
您可能还需要检查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();
}
public static long nextDate(整数天、整数小时、整数分钟){
//初始化日历对象
当前日历=Calendar.getInstance();
日历目标=Calendar.getInstance();
//获取一周中的当前日期。
//日历类工作日索引从星期天的1开始,星期一的2开始,等等。
//将其从周一的零开始更改为周日的六
inttoday=target.get(日历.一周中的第二天)-2;
如果(今天==-1)今天=7;
整数差=-1;
如果(今天你到目前为止的尝试是什么?看看@PaulLo,我问的是如何获取日期,而不是如何安排。我正在为Android开发程序。用java.util.concurrent.ScheduledExecutorService编写自己的调度程序不是什么大问题。当然这取决于需求。我问的是如何获取日期,而不是如何安排。我正在为Android开发这个程序。如果你所说的调度程序是指“决定性睡眠的踏板池”,那当然可以。但人们通常不会用“调度程序”这个词。我认为一个主要的要求是改变和保持调度的能力。但是,是的,很难从这个问题中分辨出来。:)Android有自己的AlarmManager
来安排任务。这不是问题,但我只是想知道如何找到最接近的符合标准的日期时间。我已经更新了我的答案,以便更准确地尝试和回答您的问题。我希望它能有所帮助。:)谢谢您的回答。我在下面发布了我的实现。