更新時間:2022-04-24 09:21:12 來源:動力節點 瀏覽2586次
給定一個 cron 表達式和一個時間戳,您可以獲得滿足 cron 表達式的下一個時間戳。
在另一個項目中,我決定使用 cron 表達式語法來編碼調度信息。因此,這個獨立的庫用于解析和應用時間戳到 cron 表達式。
此實現中的時間匹配算法是高效的,它盡可能避免猜測下一個匹配時間戳,這是許多實現中常見的技術。
還有一個配套的命令行實用程序來評估 cron 時間表達式:https ://github.com/gorhill/cronexpr/tree/master/cronexpr (當然使用這個庫)。
秒數 0-59 * / , -
分鐘 是 0-59 * / , -
小時 是 0-23 * / , -
日期 是 1-31 * / , - LW
月份 是 1-12 或 JAN-DEC * / , -
星期幾 是 0-6 或 SUN-SAT * / , - L #
年份 1970–2099 * / , -
星號 ( * )
星號表示 cron 表達式匹配該字段的所有值。例如,在第 4 個字段(月)中使用星號表示每個月。
斜線 ( / )
斜線描述范圍的增量。例如3-59/15,在分鐘字段中指示一小時的第三分鐘以及之后每 15 分鐘一次。該形式*/...等價于“first-last/...”形式,即在字段的最大可能范圍上遞增。
逗號 ( , )
逗號用于分隔列表中的項目。例如,MON,WED,FRI在第 5 個字段(星期幾)中使用表示星期一、星期三和星期五。
連字符 ( - )
連字符定義范圍。例如,2000-2010 表示從公元 2000 年到 2010 年之間的每一年,包括在內。
大號
L代表“最后”。當在星期幾字段中使用時,它允許您指定構造,例如5L給定月份的“最后一個星期五”( )。在 day-of-month 字段中,它指定該月的最后一天。
W
W日期字段允許使用該字符。此字符用于指定距給定日期最近的工作日(周一至周五)。例如,如果您要指定15W為 day-of-month 字段的值,則其含義是:“距每月 15 日最近的工作日”。
因此,如果 15 日是星期六,則觸發器會在 14 日星期五觸發。如果 15 日是星期日,則觸發器會在 16 日星期一觸發。如果 15 日是星期二,那么它會在 15 日星期二觸發。但是,如果您指定1W日期的值,并且第 1 天是星期六,則觸發器會在第 3 天的星期一觸發,因為它不會“跳過”一個月的日期邊界。
W僅當月份中的某天是一天,而不是日期范圍或日期列表時,才可以指定該字符。
該W字符還可以與 結合L,即LW表示“本月的最后一個工作日”。
哈希 (#)
#允許用于星期幾字段,并且后面必須跟一個介于 1 到 5 之間的數字。它允許您指定構造,例如給定月份的“第二個星期五”。
條目描述相當于
@annually 每年 1 月 1 日凌晨午夜運行一次 0 0 0 1 1 * *
@yearly 每年 1 月 1 日午夜運行一次 0 0 0 1 1 * *
@monthly 每月第一天凌晨的午夜運行一次 0 0 0 1 * * *
@weekly 每周在周日早上的午夜運行一次 0 0 0 * * 0 *
@daily 每天午夜運行一次 0 0 0 * * * *
@hourly 每小時開始運行一次 0 0 * * * * *
@reboot 不支持
如果僅存在六個字段,0則附加第二個字段,即* * * * * 2013內部成為0 * * * * * 2013。
如果僅存在五個字段,0則附加第二個字段并附加一個通配符年份字段,即* * * * Mon內部成為0 * * * * Mon *。
星期字段的域是 [0-7] 而不是 [0-6],7 是星期日(如 0)。這符合http://linux.die.net/man/5/crontab#。
截至目前,如果提供了格式錯誤的 cron 表達式,則代碼的行為尚未確定
去獲取 github.com/gorhill/cronexpr
導入庫:
導入“github.com/gorhill/cronexpr”
導入“時間”
最簡單的方法:
nextTime := cronexpr.MustParse("0 0 29 2 *").Next(time.Now())
假設time.Now()是“2013-08-29 09:28:00”,那么nextTime將是“2016-02-29 00:00:00”。
如果要重用它,可以保留返回的 Expression 指針:
expr := cronexpr.MustParse("0 0 29 2 *")
nextTime := expr.Next(time.Now())
...
nextTime = expr.Next(nextTime)
用于time.IsZero()查明是否返回了有效時間。例如,
cronexpr.MustParse("* * * * * 1980").Next(time.Now()).IsZero()
將返回true,而
cronexpr.MustParse("* * * * * 2050").Next(time.Now()).IsZero()
將返回false(截至 2013 年 8 月 29 日...)
您還可以查詢n下一個時間戳:
cronexpr.MustParse("0 0 29 2 *").NextN(time.Now(), 5)
它返回一段 time.Time 對象,包含以下時間戳(截至 2013 年 8 月 30 日):
2016-02-29 00:00:00
2020-02-29 00:00:00
2024-02-29 00:00:00
2028-02-29 00:00:00
2032-02-29 00:00:00
Next和返回的時間值NextN的時區始終是作為參數傳遞的時間值的時區,除非返回零時間值。如果大家想了解更多相關知識,不妨來關注一下動力節點的Java在線學習,里面的課程內容從入門到精通,通俗易懂,適合小白學習,希望對大家能夠有所幫助。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習