我有一个应用程序需要做一些动作,每日更改说在午夜。每当更改日期时,应用程序应该说相同。将不胜感激关于如何实现功能的任何帮助。如何跟踪日期在Java中的变化
回答
您正在寻找的是一个调度程序。 Quartz可能是Java世界中最常用的调度程序,但如果您已经在使用该框架,Spring会提供一些有趣的调度功能。
无论您选择哪个调度程序,您通常都会指定要发生的操作(有时称为“作业”)和发生的时间(Quartz术语中的“触发器”)。在你的情况下,你会设置触发器每天在午夜运行,当它触发时,它会根据你的工作规定来做你需要做的任何事情。
作为一个库,您可以使用Quartz
并设置触发器在每晚午夜运行。我认为简单的触发器应该可以完成这项工作。
或者,您可以通过使用单独的线程并休眠直到下一个午夜来实现Quartz自己做些什么。
如果你不想要Quartz或任何其他类似的框架,你可以简单地使用ScheduledExecutorService的scheduleAtFixedRate方法来代替(这里有一个如何在JavaDoc中实例化的例子)。
你唯一需要考虑的是如何计算第一天的开始。
编辑
由于Jarnbjo提到:这将无法生存夏令时间开关,跨越式秒。所以在使用Executor时要注意这一点。
这个问题的答案曾经是Quartz。这是Java中调度的事实标准。它很容易使用,但它有点重量级。如果你不关心作业的集群调度或JDBC存储,石英可能会过度杀伤。
谢天谢地,Spring 3.0带有新的调度功能。这些允许简单的“做这个evey 30秒”或者“每天在午夜做这个”类型的调度,而不使用石英。如果您已经在使用弹簧,设置起来非常简单。
例子:
<task:scheduler id="scheduler" pool-size="10"/>
<task:scheduled-tasks scheduler="scheduler">
<task:scheduled ref="anotherObject" method="anotherMethod" cron="* * 00 * * *"/>
</task:scheduled-tasks>
这将导致法 'anotherMethod' 被称为你的bean命名为 'anotherObject' 每天午夜的。更多的信息可以在春季网站上找到:http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/scheduling.html
嗯,调用石英重量级与Spring相比...... – laura 2010-03-29 11:47:26
@laura很多人已经将Spring作为IoC的依赖项。我不建议只将Spring包含在这个功能中,但如果你使用的是弹簧,那么这比重新使用所有的石英轻。 – 2010-03-29 20:12:21
你不需要一个庞大的框架。像这样的东西应该工作。
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
}
}
如果你想比整个图书馆更轻量级的解决方案,我发现了一个非常简单的实现here。它基本上是一个Timer
类。
当经由
Start()
方法首先执行类,代码获取的当前时间的日期时间,然后得到午夜的日期时间对象,并以得到的时间,直到它是午夜减去2倍。此时,它设置定时器间隔并启动定时器。现在,当达到间隔并且定时器触发其事件时,我使用相同的过程重置定时器。这将使间隔为24.当此计时器到期时,它将被重置并无限重复。
- 1. 如何解析Java中的跟踪日期?
- 2. 跟踪表中的变化
- 3. 如何跟踪div的尺寸变化
- 4. 如何跟踪Python的变化?
- 5. 跟踪变化在Django
- 6. 我如何记录(跟踪)变化
- 7. 跟踪数据变化
- 8. 保持跟踪变化 - Django
- 9. 如何在java中格式化日期?
- 10. 保持跟踪UIView中的变化
- 11. 每天跟踪表格中的变化
- 12. 如何跟踪到期
- 13. java JTable如何跟踪行
- 14. 如何跟踪的时间在Java
- 15. 现有表的日期跟踪更改
- 16. 如何跟踪变量?
- 17. 如何跟踪SQL Server中的日志文件大小演变?
- 18. 如何跟踪iPad中的语言变化?
- 19. 我如何跟踪ubuntu中firefox的标题变化?
- 20. 如何跟踪MS SQL Server 2008中的变化
- 21. 跟踪时间在Java中
- 22. 在java中调用跟踪
- 23. 长期跟踪mysql的变化 - 形成线图等
- 24. ko.computed跟踪数组元素的变化
- 25. git跟踪一个文件的变化
- 26. 用户开始在Android中跟踪位置的日期时间
- 27. 如何跟踪/记录的实体的版本变化
- 28. 跟踪自动变量生存期?
- 29. Android/Java:如何跟踪InputStream的进度
- 30. 如何使Subversion跟踪分支上的变化
这将无法正常工作,因为午夜不会以固定的速度重新分配。 – jarnbjo 2010-03-29 11:18:09
当然,但在大多数情况下,这并不重要。 – Hardcoded 2010-03-29 11:19:32
如果您想在午夜执行某些操作,那么在11PM或1AM时执行该作业可能不太合适。其中“大多数情况下”是这种可接受的行为? – jarnbjo 2010-03-29 11:39:16