使用 Croniter 解析 Quartz cron 表达式

问题描述 投票:0回答:2

此代码:

starting_point = datetime.datetime.now() - datetime.timedelta(hours=1)
cron = croniter.croniter('44 5 19 ? * WED,THU,FRI *', starting_point)
cron.get_next(datetime.datetime)

结果:

croniter.croniter.CroniterBadCronError:必须为迭代器表达式指定 5 或 6 列。

但是当使用 https://www.freeformatter.com/cron-expression-generator-quartz.html 时,相同的表达式会产生

每月每周三、四、五晚上 19:05:44

如何用croniter解析这个cron表达式?

python cron quartz-scheduler
2个回答
3
投票

您所指的网站使用支持字段的Quartz Scheduler

Seconds, Minutes, Hours, Day Of Month, Month, Day Of Week, Year
但是对于 

croniter Seconds

 字段是可选的,显然应该在最后一个位置(我没有发现这有特别好的记录,并通过实验得出了结论):

Minutes, Hours, Day Of Month, Day Of Week, Seconds
此外,它似乎不支持

?

通配符。

所以等价的表达式似乎是

5 19 * * WED,THU,FRI 44
演示:

>>> import croniter >>> import datetime >>> c = croniter.croniter('5 19 * * WED,THU,FRI 44') >>> print(datetime.datetime.utcfromtimestamp(next(c))) 2021-04-23 19:05:44 >>> print(datetime.datetime.utcfromtimestamp(next(c))) 2021-04-28 19:05:44 >>> print(datetime.datetime.utcfromtimestamp(next(c))) 2021-04-29 19:05:44
    

0
投票
如果您想保持

quartz 格式的确切顺序,我发现这个 cron-schedule-triggers

 库对我有用。这是代码:

import datetime from cstriggers.core.trigger import QuartzCron sched = '0 5 23 * * ?' start_date = datetime.datetime.now() cron_obj = QuartzCron(schedule_string=sched, start_date=start_date) print(cron_obj.next_trigger(isoformat=True)) >> 2024-12-09T23:05:00.152219
    
© www.soinside.com 2019 - 2024. All rights reserved.