繁体   English   中英

在一定时间内执行Java程序

[英]Execute java program between certain time duration

我有一个要求,我需要在工作日的上午9点到下午5点之间运行Java程序。 时区将始终为UTC。 该程序应从上午9点开始,并应在下午5点之前结束。 如果无法在下午5点之前完成,则应睡到第二天08:59:59。 如果第二天是周末,那么应该从星期一开始。

使用Joda时间的两个日期之间以秒为单位的文章差异? 解释了如何获取两个预定义日期之间的秒差,但是我一直想计算下一个工作日上午9点与当前时间之间的差。

我正在考虑通过计算两个日期之间的时间差来使用Thread.sleep()。 是否有一个Joda Time API,可以用来计算两个日期之间的时差?

我已经尝试获取当前工作日和第二天上午9点(如果是工作日),计算这两个纪元之间的差,并将该值用于Thread.sleep,但有点混乱。

以下是我使用的伪代码

getNextDayEpoch函数包含if / else代码,使用确定日期是工作日/周末java确定是工作日还是周末

根据是工作日还是周末,我得到相应的纪元值。

currentEpoch = getCurrentEpoch()
nextDayEpoch = getNextDayEpoch()

difference = nextDayEpoch - currentDayEpoch

try {
    Thread.sleep(difference);
} catch (InterruptedException e) {
    e.printStackTrace();
}

您能提出更好的建议吗?

也许您想了解Scheduling ScheduledExecutorService的知识 ,也可以看看Quartz-Framwork

我会为此选择石英。

如果您当前在项目中使用spring,则可以使用cron参数尝试@Scheduled注释

@Scheduled(cron = "0 0 1 * * ?")
public void doThing() {
//...
}

参见https://spring.io/guides/gs/scheduling-tasks/

Joda-Time项目现在处于维护模式 Joda-Time的创建者Stephen Colebourne继续领导JSR 310及其在java.time类中的实现。

设置您的限制。

LocalTime ltStart = LocalTime.of( 9 , 0 ) ; 
LocalTime ltStop = LocalTime.of( 17 , 0 ) ; 

获取您所需时区中显示的当前时刻。

ZoneId z = ZoneOffset.UTC ;  // Or ZoneId.of( "Africa/Casablanca" ) or such.
ZonedDateTime now = ZonedDateTime.now( z ) ;

比较一天中的时间。

if( now.toLocalTime().isBefore( ltStart() ) {
    // Wait until start
    Duration d = Duration.between( now , now.with( ltStart ) ) ;
    // Use that duration to schedule task. 
}

查看当前时刻是否在工作时间内。

if( ( ! now.toLocalTime().isBefore( ltStart ) && ( now.toLocalTime().isBefore( ltStop ) { // do work }

如果现在是停止时间后,加一天plusDays ,打电话with明天设置为上午9点,并计算持续时间的等待时间长度。

您需要下一个工作日。 您可以使用DayOfWeek枚举自己编写代码以跳过星期六和星期日。 但是我建议在您的项目中添加ThreeTen-Extra库(也由Stephen Colebourne领导)。 它提供TemporalAdjusternextWorkingDay实现。

// If the current time is on or after the stop time…
if( ! now.toLocalTime().isBefore( ltStop ) ) { 
    TemporalAdjuster ta = org.threeten.extra.Temporals.nextWorkingDay() ;
    ZonedDateTime nextStart = now.with( ltStart ).with( ta ) ;
    Duration d = Duration.between( now , nextStart ) ;
    // Use duration to schedule next execution.
}

在测试了三种可能的情况(在启动之前,在启动停止之间以及在停止之后)之后,我建议添加“ else”作为防御性编程,以确保您的代码正确。

Thread.sleep(差异);

休眠线程可以工作,但这是一种相对粗糙的方法。

了解有关Java的Executors框架的信息,以简化计划任务的工作。 请参见Oracle教程 并搜索Stack Overflow,因为已经讨论了很多次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM