是否有用于解析 AWS cron 字符串并将其转换为日历日期的 python 库?

Is there a python library for parsing AWS cron strings and converting them to calendar dates?

我想获取从调用 boto3 api 调用返回的所有 cron 表达式的列表。获取该列表并将其转换为当月的日历日期。这样我就可以使用后端的日期来查看日历上的事件。

我目前面临的问题是我在 python 中找不到用于解析 AWS cron 字符串的库,绝对不是同时进行解析和 cron 到日期转换的库。

有谁知道有任何 python 库可以进行此类工作吗?

AWS cron 字符串不同于 cron/crontab。

https://docs.aws.amazon.com/glue/latest/dg/monitor-data-warehouse-schedule.html

cron(Minutes Hours Day-of-month Month Day-of-week Year)

通配符

,(逗号)通配符包含附加值。在月份字段中,JAN、FEB、MAR 将包括一月、二月和三月。

-(破折号)通配符指定范围。在天字段中,1–15 将包括指定月份的第 1 天到第 15 天。

*(星号)通配符包括字段中的所有值。在小时字段中,* 将包括每小时。

/(正斜杠)通配符指定增量。在分钟字段中,您可以输入 1/10 以指定每 10 分钟,从该小时的第一分钟开始(例如,第 11、21 和 31 分钟)。

那个? (问号)通配符指定一个或另一个。在 Day-of-month 字段中,您可以输入 7,如果您不关心第七天是星期几,您可以输入 ?在“星期几”字段中。

日期或星期字段中的 L 通配符指定该月或该周的最后一天。

日期字段中的 W 通配符指定工作日。在 Day-of-month 字段中,3W 指定最接近该月第三个工作日的日期。

限制

您不能在同一个 cron 表达式中指定 Day-of-month 和 Day-of-week 字段。如果您在其中一个字段中指定一个值,则必须使用 ? (问号)在另一个。

不支持导致速度快于 5 分钟的 Cron 表达式。

pyawscron:

https://github.com/pitchblack408/pyawscron

https://pypi.org/project/pyawscron/

这是来自打字稿项目的 python 端口:

https://github.com/beemhq/aws-cron-parser

cron = '23,24,25 17,18 25 MAR/4 ? 2020,2021,2023,2028'
cron = AWSCron(cron)
dt = datetime.datetime(2020, 5, 9, 22, 30, 57, tzinfo=datetime.timezone.utc)
dt = cron.occurrence(dt).next()

@pitchblack408,请合并我审核后提出的拉取请求。

pitchblack408 在将打字稿项目移植到 Python 方面做得很好。 这真的很有帮助。然而,README 中有一个小错字,因此我在使用它时摸不着头脑。我不得不阅读整个源代码,然后终于搞定了。

我提出了一个拉取请求来修复 README 中的拼写错误,并添加了一些对使用它的人真正有帮助的方法。虽然该拉取请求已合并,但请大家尝试下面的代码。

注意:错字出现在 occurrence 方法中。

    dt = cron.occurrence(dt).next()

除此之外,还有我添加的方法的详细信息...

添加了其他方法 get_all_schedule_bw_datesget_next_n_schedule

这些方法在使用 AWS cron 计划时非常有用。

例如...

  1. 当需要获取两个日期之间所有可能的执行日期时,可以使用get_all_schedule_bw_dates比较是否执行完成。

    from_dt = datetime.datetime(2021, 8, 7, 8, 30, 57, tzinfo=datetime.timezone.utc)
    to_date = datetime.datetime(2021, 8, 7, 11, 30, 57, tzinfo=datetime.timezone.utc)
    
    AWSCron.get_all_schedule_bw_dates(from_dt, to_date, '0/23 * * * ? *')
    
    # Outputs
    
    [datetime.datetime(2021, 8, 7, 8, 46, tzinfo=datetime.timezone.utc),
    datetime.datetime(2021, 8, 7, 9, 0, tzinfo=datetime.timezone.utc),
    datetime.datetime(2021, 8, 7, 9, 23, tzinfo=datetime.timezone.utc),
    datetime.datetime(2021, 8, 7, 9, 46, tzinfo=datetime.timezone.utc),
    datetime.datetime(2021, 8, 7, 10, 0, tzinfo=datetime.timezone.utc),
    datetime.datetime(2021, 8, 7, 10, 23, tzinfo=datetime.timezone.utc),
    datetime.datetime(2021, 8, 7, 10, 46, tzinfo=datetime.timezone.utc),
    datetime.datetime(2021, 8, 7, 11, 0, tzinfo=datetime.timezone.utc),
    datetime.datetime(2021, 8, 7, 11, 23, tzinfo=datetime.timezone.utc)]
    
  2. 有时您必须根据 cron 模式预测接下来的几次(比如 5 或 10 次)执行。在这种情况下,您可以使用 get_next_n_schedule 并根据我们的要求传递 n。

    from_dt = datetime.datetime(2021, 8, 7, 8, 30, 57, tzinfo=datetime.timezone.utc)
    
    AWSCron.get_next_n_schedule(10, from_dt, '0/23 * * * ? *')
    
    #Outputs
    [datetime.datetime(2021, 8, 7, 8, 46, tzinfo=datetime.timezone.utc),
    datetime.datetime(2021, 8, 7, 9, 0, tzinfo=datetime.timezone.utc),
    datetime.datetime(2021, 8, 7, 9, 23, tzinfo=datetime.timezone.utc),
    datetime.datetime(2021, 8, 7, 9, 46, tzinfo=datetime.timezone.utc),
    datetime.datetime(2021, 8, 7, 10, 0, tzinfo=datetime.timezone.utc),
    datetime.datetime(2021, 8, 7, 10, 23, tzinfo=datetime.timezone.utc),
    datetime.datetime(2021, 8, 7, 10, 46, tzinfo=datetime.timezone.utc),
    datetime.datetime(2021, 8, 7, 11, 0, tzinfo=datetime.timezone.utc),
    datetime.datetime(2021, 8, 7, 11, 23, tzinfo=datetime.timezone.utc),
    datetime.datetime(2021, 8, 7, 11, 46, tzinfo=datetime.timezone.utc)]