簡體   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