如何跟踪Java中的日期更改

时间:2010-03-29 10:15:57

标签: java

我有一个应用程序,需要在每个日期更改时执行一些操作,如午夜。每当日期改变时,应该说相同的应用程序。任何有关如何实现该功能的帮助将不胜感激。

6 个答案:

答案 0 :(得分:7)

您正在寻找的是一个调度程序。 Quartz可能是Java世界中最常用的调度程序,但如果您已经在使用该框架,则Spring会有一些有趣的调度功能。

无论您选择哪种调度程序,通常都会指定要执行的操作(有时称为“作业”)及其发生的时间(Quartz术语中的“触发器”)。在你的情况下,你将触发器设置为每天午夜运行,当它被解雇时,它会做你需要做的任何事情,正如你的工作所规定的那样。

答案 1 :(得分:1)

作为一个库,您可以使用Quartz并将触发器设置为每晚午夜运行。我认为简单的触发器应该可以胜任。

或者,你可以通过使用一个单独的线程来实现Quartz自己做的事情,然后一直睡到下一个午夜。

答案 2 :(得分:0)

此问题的答案曾是Quartz。它是Java中调度的事实标准。它很容易使用,但它有点重量级。如果您不关心作业的集群调度或JDBC存储,那么quartz可能会过度。

值得庆幸的是,Spring 3.0带来了新的调度功能。这些允许简单的'做这个evey 30秒'或'每天午夜做'这种类型的日程安排,而不使用石英。如果您已经使用spring,那么设置非常简单。

示例:

<task:scheduler id="scheduler" pool-size="10"/>

<task:scheduled-tasks scheduler="scheduler">
    <task:scheduled ref="anotherObject" method="anotherMethod" cron="* * 00 * * *"/>
</task:scheduled-tasks>

这将导致每天午夜在名为'anotherObject'的bean上调用方法'anotherMethod'。有关更多信息,请访问spring网站:http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/scheduling.html

答案 3 :(得分:0)

你不需要一个庞大的框架。这样的事情应该有效。

import java.util.*;
public class Midnight {
    public static void main(String args[])  {
        MidnightCowboy mc = new MidnightCowboy();
        mc.start();
        // on with you normal program flow (if any) here
    }
}

class MidnightCowboy extends Thread  {
    static final boolean COWS_COME_HOME = false;
    // Whatever data you need should go here

    public void run()  {
        while (! COWS_COME_HOME)  {
            GregorianCalendar now = new GregorianCalendar();
            long nowMilli = now.getTimeInMillis();
            now.add(Calendar.DAY_OF_MONTH, 1);      // probably an easier way to set the time to the next midnight
            now.set(Calendar.HOUR_OF_DAY, 0);   
            now.set(Calendar.MINUTE, 0);
            now.set(Calendar.SECOND, 0);
            now.set(Calendar.MILLISECOND, 0);
            long midnightMilli = now.getTimeInMillis();
            long delta = midnightMilli - nowMilli;
            System.out.println("Waiting " + delta + " milliseconds until midnight.");
            // How many milliseconds until the next midnight?
            try  {
                sleep(delta);
                doSomething();
            } catch (InterruptedException e)  {
                System.err.println("I was rudely interrupted!");
            }
        }
    }

    void doSomething() {
        // whatever
    }
}

答案 4 :(得分:0)

如果你想要一个比整个库更轻量级的解决方案,我发现了一个非常简单的实现here。它基本上是Timer类。

  

当首次通过Start()方法执行类时,代码获取当前时间的日期时间,然后获取午夜的datetime对象并减去2次以便给出一个时间,直到它是午夜

     

此时,它设置定时器间隔并启动定时器。现在当达到间隔并且计时器触发其事件时,我使用相同的过程重置计时器。这将使间隔为24.当此计时器到期时,它将被重置并无限期重复。<​​/ p>

答案 5 :(得分:-1)

如果你不想要Quartz或任何其他类似的框架,你可以简单地使用scheduleAtFixedRateScheduledExecutorService方法(这里有一个如何在JavaDoc中实例化一个)的例子。

你唯一需要考虑的是如何计算第一天的开始。

修改

正如Jarnbjo所说:这将无法在夏令时开关和闰秒中存活。因此,在使用Executor时请注意这一点。