簡體   English   中英

通過hh:mm:ss在特定時間每天運行的計划

[英]Schedule that runs every day at a specific time with hh:mm:ss

我試圖每天在特定時間運行代碼,但是使用hh:mm:ss。 我具體來說是嘗試每天在美國東部標准時間下午5點運行它,因此需要考慮時區。

這是我在科特林的嘗試:

val timer = Timer()
val format = SimpleDateFormat("hh:mm:ss") 
val date = format.parse("11:07:09")
timer.schedule(object : TimerTask() {
    override fun run() {
       // code here
    }
}, date)

我無法使它正常工作,即使我做到了,我也不確定如何向其添加時區。

我怎樣才能做到這一點?

tl; dr

java.util.Date
.from(
    ZonedDateTime.of( 
        LocalDate.now( ZoneId.of( "America/Montreal" )  ) , 
        LocalTime.parse( "11:07:09" ) , 
        ZoneId.of( "America/Montreal" ) 
    )
    .toInstant()
)

細節

java.util.Date表示帶有UTC時間的日期的日期。

您已經忽略了日期和區域/偏移量。

您的結果顯然默認為1970年1月1日上午11點。

java.time

同樣,可怕的DateSimpleDateFormat類在幾年前被java.time類取代。

代表您的目標時間。

LocalTime lt = LocalTime.parse( "11:07:09" ) ;

獲取當前日期,今天的日期。 需要一個時區。 在任何給定時刻,日期都會在全球范圍內變化。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalDate today = LocalDate.now( z ) ;

將它們放在一起確定一個時刻。

ZonedDateTime zdt = ZonedDateTime.of( today , lt , z ) ;  // Time-of-day will be adjusted if not valid on that date in that zone. 

調整為UTC。 同一時刻,時間軸上的同一點,不同的時鍾時間。

Instant instant = zdt.toInstant() ;  // Adjust from zone to UTC.

避免使用舊的日期時間類。 但是,如果必須互操作,則可以通過調用添加到舊類中的新方法來回轉換。

java.util.Date d = java.util.Date.from( instant ) ;

您可能需要改進此代碼,以查看所需的時間是否已經過去。 要進行比較,請使用isAfterisBefore方法。

執行者

Timer類已被執行者框架取代。 搜索《 Oracle Java教程和堆棧溢出》以了解更多信息。

使用執行程序,您可以計划任務在特定時刻運行。 但是您可以通過指定等待時間而不是一天中的時間來間接執行此操作。 調度執行器接受一個初始延遲的參數。 您可以將該延遲計算為當前時刻和所需時刻之間的時間跨度。

要計算該時間跨度,請使用Duration類。

Duration d = Duration.between( Instant.now() , instant ) ;

請記住,您無法期望瞬間執行任務的完美時機。 在主機OS上調度JVM以及在JVM中調度Java線程可能會導致延遲。

當然,完成后,您還需要記錄任務的歷史記錄。 當您的應用關閉並重新啟動時,它需要研究歷史記錄以找出如何設置新時間表。 此問題不在此答案的范圍內。 閱讀有關編寫文件,使用數據庫或依賴於某些其他持久性方案的信息。


關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.DateCalendarSimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參見Oracle教程 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310

您可以直接與數據庫交換java.time對象。 使用與JDBC 4.2或更高版本兼容的JDBC驅動程序 不需要字符串,不需要java.sql.*類。

在哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM