Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 第二天X在Y_Java_Date_Calendar - Fatal编程技术网

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
    来安排任务。这不是问题,但我只是想知道如何找到最接近的符合标准的日期时间。我已经更新了我的答案,以便更准确地尝试和回答您的问题。我希望它能有所帮助。:)谢谢您的回答。我在下面发布了我的实现。