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

我想列出从调用 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)

enter image description here

通配符

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

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

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

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

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

Day-of-month 或 Day-of-week 字段中的 L 通配符指定月或周的最后一天。

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

限制

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

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

stack overflow Is there a python library for parsing AWS cron strings and converting them to calendar dates?
原文答案
author avatar

接受的答案

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 在将 typescript 项目移植到 Python 方面做得很好。这真的很有帮助。然而,自述文件中有一个小错字,因为我在使用它时摸不着头脑。我不得不阅读整个源代码,然后终于明白了。

我提出了一个拉取请求来修复自述文件中的错字,并添加了一些对使用它的人真正有帮助的方法。虽然该拉取请求已合并,但请每个人都尝试下面的代码。

注意:错字出现在 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)]

``` 
  1. 有时您必须根据 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)]