跳转到主要内容

croniter提供了类似于cron格式的datetime对象的迭代

项目描述

简介

croniter提供了类似于cron格式的datetime对象的迭代。

                      _ _
  ___ _ __ ___  _ __ (_) |_ ___ _ __
 / __| '__/ _ \| '_ \| | __/ _ \ '__|
| (__| | | (_) | | | | | ||  __/ |
 \___|_|  \___/|_| |_|_|\__\___|_|

网站:https://github.com/kiorky/croniter

构建徽章

https://github.com/kiorky/croniter/actions/workflows/cicd.yml/badge.svg

用法

简单示例

>>> from croniter import croniter
>>> from datetime import datetime
>>> base = datetime(2010, 1, 25, 4, 46)
>>> iter = croniter('*/5 * * * *', base)  # every 5 minutes
>>> print(iter.get_next(datetime))   # 2010-01-25 04:50:00
>>> print(iter.get_next(datetime))   # 2010-01-25 04:55:00
>>> print(iter.get_next(datetime))   # 2010-01-25 05:00:00
>>>
>>> iter = croniter('2 4 * * mon,fri', base)  # 04:02 on every Monday and Friday
>>> print(iter.get_next(datetime))   # 2010-01-26 04:02:00
>>> print(iter.get_next(datetime))   # 2010-01-30 04:02:00
>>> print(iter.get_next(datetime))   # 2010-02-02 04:02:00
>>>
>>> iter = croniter('2 4 1 * wed', base)  # 04:02 on every Wednesday OR on 1st day of month
>>> print(iter.get_next(datetime))   # 2010-01-27 04:02:00
>>> print(iter.get_next(datetime))   # 2010-02-01 04:02:00
>>> print(iter.get_next(datetime))   # 2010-02-03 04:02:00
>>>
>>> iter = croniter('2 4 1 * wed', base, day_or=False)  # 04:02 on every 1st day of the month if it is a Wednesday
>>> print(iter.get_next(datetime))   # 2010-09-01 04:02:00
>>> print(iter.get_next(datetime))   # 2010-12-01 04:02:00
>>> print(iter.get_next(datetime))   # 2011-06-01 04:02:00
>>>
>>> iter = croniter('0 0 * * sat#1,sun#2', base)  # 1st Saturday, and 2nd Sunday of the month
>>> print(iter.get_next(datetime))   # 2010-02-06 00:00:00
>>>
>>> iter = croniter('0 0 * * 5#3,L5', base)  # 3rd and last Friday of the month
>>> print(iter.get_next(datetime))   # 2010-01-29 00:00:00
>>> print(iter.get_next(datetime))   # 2010-02-19 00:00:00

您需要了解的只是如何使用构造函数和get_next方法,这些方法的签名如下

>>> def __init__(self, cron_format, start_time=time.time(), day_or=True)

croniter从start_time开始,按照cron_format迭代。 cron_format的格式为min hour day month day_of_week,更多详情请参考http://zh.wikipedia.org/wiki/Cronday_or开关用于控制croniter如何处理dayday_of_week条目。默认选项是cron的行为,使用OR连接这些值。如果开关设置为False,则使用AND连接这些值。这类似于fcron,并允许您例如通过设置月份和星期几来定义每个月第二个星期五执行的任务。

>>> def get_next(self, ret_type=float)

get_next根据cron表达式计算下一个值,并返回类型为ret_type的对象。 ret_type应该是一个浮点数或一个datetime对象。

支持为get_prev方法添加。(>= 0.2.0)

>>> base = datetime(2010, 8, 25)
>>> itr = croniter('0 0 1 * *', base)
>>> print(itr.get_prev(datetime))  # 2010-08-01 00:00:00
>>> print(itr.get_prev(datetime))  # 2010-07-01 00:00:00
>>> print(itr.get_prev(datetime))  # 2010-06-01 00:00:00

您可以使用is_valid类方法验证您的cron。(>= 0.3.18)

>>> croniter.is_valid('0 0 1 * *')  # True
>>> croniter.is_valid('0 wrong_value 1 * *')  # False

关于DST

请确保使用带时区的datetime初始化croniter实例,以便此功能生效!

使用pytz的示例

>>> import pytz
>>> tz = pytz.timezone("Europe/Paris")
>>> local_date = tz.localize(datetime(2017, 3, 26))
>>> val = croniter('0 0 * * *', local_date).get_next(datetime)

使用python_dateutil的示例

>>> import dateutil.tz
>>> tz = dateutil.tz.gettz('Asia/Tokyo')
>>> local_date = datetime(2017, 3, 26, tzinfo=tz)
>>> val = croniter('0 0 * * *', local_date).get_next(datetime)

使用python内置模块的示例

>>> from datetime import datetime, timezone
>>> local_date = datetime(2017, 3, 26, tzinfo=timezone.utc)
>>> val = croniter('0 0 * * *', local_date).get_next(datetime)

关于秒重复

Croniter能够处理带有秒重复的crontab格式,默认情况下,秒是第6个字段

>>> base = datetime(2012, 4, 6, 13, 26, 10)
>>> itr = croniter('* * * * * 15,25', base)
>>> itr.get_next(datetime) # 4/6 13:26:15
>>> itr.get_next(datetime) # 4/6 13:26:25
>>> itr.get_next(datetime) # 4/6 13:27:15

您也可以注意到,此表达式将从开始日期时间起每秒重复一次。

>>> croniter('* * * * * *', local_date).get_next(datetime)

您也可以将秒作为第一个字段使用

>>> itr = croniter('15,25 * * * * *', base, second_at_beginning=True)

关于年

Croniter还支持年份字段。年份位于第7个字段,位于秒重复之后。年份字段的范围是1970年至2099年。要忽略秒重复,只需将秒设置为0或任何其他常量即可

>>> base = datetime(2012, 4, 6, 2, 6, 59)
>>> itr = croniter('0 0 1 1 * 0 2020/2', base)
>>> itr.get_next(datetime) # 2020 1/1 0:0:0
>>> itr.get_next(datetime) # 2022 1/1 0:0:0
>>> itr.get_next(datetime) # 2024 1/1 0:0:0

支持开始时间偏移

请参阅https://github.com/kiorky/croniter/pull/76,您可以将start_time=,然后设置expand_from_start_time=True,以便您的生成从start_time而不是日历天计算

>>> from pprint import pprint
>>> iter = croniter('0 0 */7 * *', start_time=datetime(2024, 7, 11), expand_from_start_time=True);pprint([iter.get_next(datetime) for a in range(10)])
[datetime.datetime(2024, 7, 18, 0, 0),
 datetime.datetime(2024, 7, 25, 0, 0),
 datetime.datetime(2024, 8, 4, 0, 0),
 datetime.datetime(2024, 8, 11, 0, 0),
 datetime.datetime(2024, 8, 18, 0, 0),
 datetime.datetime(2024, 8, 25, 0, 0),
 datetime.datetime(2024, 9, 4, 0, 0),
 datetime.datetime(2024, 9, 11, 0, 0),
 datetime.datetime(2024, 9, 18, 0, 0),
 datetime.datetime(2024, 9, 25, 0, 0)]
>>> # INSTEAD OF THE DEFAULT BEHAVIOR:
>>> iter = croniter('0 0 */7 * *', start_time=datetime(2024, 7, 11), expand_from_start_time=False);pprint([iter.get_next(datetime) for a in range(10)])
[datetime.datetime(2024, 7, 15, 0, 0),
 datetime.datetime(2024, 7, 22, 0, 0),
 datetime.datetime(2024, 7, 29, 0, 0),
 datetime.datetime(2024, 8, 1, 0, 0),
 datetime.datetime(2024, 8, 8, 0, 0),
 datetime.datetime(2024, 8, 15, 0, 0),
 datetime.datetime(2024, 8, 22, 0, 0),
 datetime.datetime(2024, 8, 29, 0, 0),
 datetime.datetime(2024, 9, 1, 0, 0),
 datetime.datetime(2024, 9, 8, 0, 0)]

测试日期是否与crontab匹配

进行匹配测试(>=0.3.32)

>>> croniter.match("0 0 * * *", datetime(2019, 1, 14, 0, 0, 0, 0))
True
>>> croniter.match("0 0 * * *", datetime(2019, 1, 14, 0, 2, 0, 0))
False
>>>
>>> croniter.match("2 4 1 * wed", datetime(2019, 1, 1, 4, 2, 0, 0)) # 04:02 on every Wednesday OR on 1st day of month
True
>>> croniter.match("2 4 1 * wed", datetime(2019, 1, 1, 4, 2, 0, 0), day_or=False) # 04:02 on every 1st day of the month if it is a Wednesday
False

测试crontab是否在datetime范围内匹配

进行匹配范围测试(>=2.0.3)

>>> croniter.match_range("0 0 * * *", datetime(2019, 1, 13, 0, 59, 0, 0), datetime(2019, 1, 14, 0, 1, 0, 0))
True
>>> croniter.match_range("0 0 * * *", datetime(2019, 1, 13, 0, 1, 0, 0), datetime(2019, 1, 13, 0, 59, 0, 0))
False
>>> croniter.match_range("2 4 1 * wed", datetime(2019, 1, 1, 3, 2, 0, 0), datetime(2019, 1, 1, 5, 1, 0, 0))
# 04:02 on every Wednesday OR on 1st day of month
True
>>> croniter.match_range("2 4 1 * wed", datetime(2019, 1, 1, 3, 2, 0, 0), datetime(2019, 1, 1, 5, 2, 0, 0), day_or=False)
# 04:02 on every 1st day of the month if it is a Wednesday
False

日期匹配之间的差距

出于性能原因,croniter限制了尝试查找下一个匹配项所花费的CPU周期数。从v0.3.35开始,此行为可以通过max_years_between_matches参数进行配置,默认窗口已从1年增加到50年。

对于许多用例,默认值应该足够好。评估多个cron表达式或处理来自不受信任来源或最终用户的cron表达式的应用程序应使用此参数。遍历稀疏cron表达式可能会导致CPU消耗增加或引发CroniterBadDateError异常,该异常指示croniter已放弃尝试查找下一个(或上一个)匹配项。显式指定max_years_between_matches提供了一种限制CPU利用率的途径,并通过消除对CroniterBadDateError的需要来简化可迭代接口。可迭代接口的差异基于以下推理:每当显式同意max_years_between_matches时,croniter就没有必要发出已放弃的信号;停止迭代更为可取。

此示例匹配1月1日星期五的凌晨4点。由于1月1日不常是星期五,因此两次发生之间可能有几年。将限制设置为15年可确保所有匹配项

>>> it = croniter("0 4 1 1 fri", datetime(2000,1,1), day_or=False, max_years_between_matches=15).all_next(datetime)
>>> for i in range(5):
...     print(next(it))
...
2010-01-01 04:00:00
2016-01-01 04:00:00
2021-01-01 04:00:00
2027-01-01 04:00:00
2038-01-01 04:00:00

但是,当只关注未来5年内的日期时,只需在上面的示例中将max_years_between_matches=5。这将导致找不到匹配项,但不会浪费在未来的不想要的匹配项上的额外周期。

使用cron迭代范围

使用croniter_range()函数在范围内查找匹配项。这与内置的range(start,stop,step)函数类似,但对于日期。step参数是一个cron表达式。在(>=0.3.34)中添加

列出2019年每个月的第一个星期六

>>> from croniter import croniter_range
>>> for dt in croniter_range(datetime(2019, 1, 1), datetime(2019, 12, 31), "0 0 * * sat#1"):
>>>     print(dt)

哈希表达式

croniter 支持Jenkins风格的哈希表达式,使用“H”定义关键字和所需的hash_id关键字参数。相同的hash_id保证了哈希表达式的稳定性,但不同的hash_id将完全不同。这允许,例如,在不手动分散的情况下,对具有不同名称的作业进行均匀分布。

>>> itr = croniter("H H * * *", hash_id="hello")
>>> itr.get_next(datetime)
datetime.datetime(2021, 4, 10, 11, 10)
>>> itr.get_next(datetime)
datetime.datetime(2021, 4, 11, 11, 10)
>>> itr = croniter("H H * * *", hash_id="hello")
>>> itr.get_next(datetime)
datetime.datetime(2021, 4, 10, 11, 10)
>>> itr = croniter("H H * * *", hash_id="bonjour")
>>> itr.get_next(datetime)
datetime.datetime(2021, 4, 10, 20, 52)

随机表达式

支持随机的“R”定义关键字,并且只在其croniter()实例内保持一致性。

>>> itr = croniter("R R * * *")
>>> itr.get_next(datetime)
datetime.datetime(2021, 4, 10, 22, 56)
>>> itr.get_next(datetime)
datetime.datetime(2021, 4, 11, 22, 56)
>>> itr = croniter("R R * * *")
>>> itr.get_next(datetime)
datetime.datetime(2021, 4, 11, 4, 19)

关键字表达式

支持Vixie cron风格的“@”关键字表达式。它们评估的结果取决于是否提供hash_id:没有hash_id对应于Vixie cron定义(精确时间,分钟分辨率),而有hash_id对应于Jenkins定义(在周期内哈希,秒分辨率)。

关键字

无hash_id

有hash_id

@midnight

0 0 * * *

H H(0-2) * * * H

@hourly

0 * * * *

H * * * * H

@daily

0 0 * * *

H H * * * H

@weekly

0 0 * * 0

H H * * H H

@monthly

0 0 1 * *

H H H * * H

@yearly

0 0 1 1 *

H H H H * H

@annually

0 0 1 1 *

H H H H * H

升级

至2.0.0版本

  • 如果您已安装,请使用指定版本的要求/base.txt安装或升级pytz <=2021.1

开发此包

git clone https://github.com/kiorky/croniter.git
cd croniter
virtualenv --no-site-packages venv
. venv/bin/activate
pip install --upgrade -r requirements/test.txt
py.test src

发布新版本

我们使用 zest.fullreleaser,这是一个出色的发布基础设施。

执行并遵循这些说明

. venv/bin/activate
pip install --upgrade -r requirements/release.txt
./release.sh

贡献者

感谢所有为这个项目做出贡献的人!如果您已经做出贡献,但您的名字下没有列出,请告诉我。

  • mrmachine

  • Hinnack

  • shazow

  • kiorky

  • jlsandell

  • mag009

  • djmitche

  • GreatCombinator

  • chris-baynes

  • ipartola

  • yuzawa-san

  • lowell80 (Kintyre)

  • scop

  • zed2015

  • Ryan Finnie (rfinnie)

  • salitaba

变更日志

3.0.3 (2024-07-26)

  • fix lint [kiorky]

3.0.2 (2024-07-26)

  • 修复get_next/get_prev/all_next/all_prev中start_time不被尊重的问题 (#86) [hesstobi, kiorky]

3.0.1 (2024-07-25)

  • 将一个 update_current 参数添加到get_next/get_prev/all_next/all_prev中,以方便编写一些下游代码,请参阅#83。 [kiorky]

3.0.0 (2024-07-23)

  • 支持年份字段 [zhouyizhen, kiorky]

  • 更好地支持6字段(秒)和7字段crons [zhouyizhen, kiorky]

  • 更好地修复哈希表达式遗漏某些条目的情况 (#82, #42, #30),修复在#42初始修复的基础上保留 [zhouyizhen, kiorky]

  • 确保在时间不可用时返回false (#81) [zhouyizhen, kiorky]

2.0.7 (2024-07-16)

  • 修复文档

2.0.6 (2024-07-16)

  • 实现second_at_beginning [zhouyizhen, kiorky]

  • 支持问号作为通配符 [zhouyizhen, kiorky]

  • 支持从参考开始时间启动cron [mghextreme, kiorky]

2.0.5 (2024-04-20)

  • 没有更改,修复lint [kiorky]

2.0.4 (2024-04-20)

  • 支持is_valid中的hashid字符串 [george-kuanli-peng, kiorky]

  • 避免在crontab扩展中过度优化 [Cherie0125, liqirui <liqirui@baidu.com>, kiorky]

2.0.3 (2024-03-19)

  • 添加match_range函数 [salitaba]

2.0.2 (2024-02-29)

  • 修复闰年(二月有29天) [zed2015]

2.0.1 (2023-10-11)

  • 修复发布问题 [kiorky]

2.0.0 (2023-10-10)

  • 添加Python 3.12支持 [rafsaf]

  • 制作主要发布说明 [kiorky]

1.4.1 (2023-06-15)

  • 为1.4.0版本创建一个向后兼容版本,更改关于支持VIXIECRON错误。(修复#47) [kiorky]

1.4.0 (2023-06-15)

  • 添加“implement_cron_bug”标志以使cron解析器与Vixie/ISC Cron的错误兼容 [kiorky, David White <dwhite2@cisco.com>] 警告:扩展方法更改返回值

1.3.15 (2023-05-25)

1.3.14 (2023-04-12)

  • 代码审查

1.3.13 (2023-04-12)

  • 添加对范围开始/结束的检查

1.3.12 (2023-04-12)

  • 恢复py2兼容性

1.3.11 (2023-04-12)

  • 不要将暴露到全局命名空间

1.3.10 (2023-04-07)

  • 修复DOW哈希解析 [kiorky]

  • 改进py3的错误处理 [kiorky]

1.3.8 (2022-11-22)

  • 增加Python 3.11支持并将文档文件移动到主文件夹 [rafsaf]

1.3.7 (2022-09-06)

1.3.5 (2022-05-14)

  • 增加Python 3.10支持 [eelkevdbos]

1.3.4 (2022-02-18)

  • 真正修复py27下的兼容性测试 [kiorky]

1.3.3 (2022-02-18)

  • 修复py27下的兼容性测试 [kiorky]

1.3.2 (2022-02-18)

  • 修复#12:set_current的回归问题 [kiorky, agateblue]

1.3.1 (2022-02-15)

  • 恢复与python2的兼容性 [kiorky]

1.3.0 (2022-02-15)

  • 增加一种使next()更容易使用的方法。这修复了#11 [kiorky]

1.2.0 (2022-01-14)

  • 强制验证day=1。在此版本之前,我们支持day=0,并且它被静默地滑到day=1以支持在6字段cron表单(第二次重复)时同时具有day和month。现在将引发CroniterBadDateError。请参阅https://github.com/kiorky/croniter/issues/6 [kiorky]

1.1.0 (2021-12-03)

  • 强制验证month=1。在此版本之前,我们支持month=0,并且它被静默地滑到month=1以支持在6字段cron表单(第二次重复)时同时具有day和month。现在将引发CroniterBadDateError。请参阅https://github.com/kiorky/croniter/issues/6 [kiorky]

1.0.15 (2021-06-25)

  • 恢复py2 [kiorky]

1.0.14 (2021-06-25)

  • 改进类型检查 [kiorky]

1.0.13 (2021-05-06)

  • 修复使用* * R/0 * *时的ZeroDivisionError [cuu508]

1.0.12 (2021-04-13)

  • 增加对hashed/random/keyword表达式的支持 Ryan Finnie (rfinnie)

  • 审查对hashed/random/keyword表达式的支持并添加expanders reactor [ kiorky ]

1.0.11 (2021-04-07)

  • 修复bug:错误案例:0 6 30 3 * [zed2015(zhangchi)]

  • 在day_of_week组件中增加对L的支持。这允许表达式如* * * * L4,这意味着每个月的最后一个星期四。这解决了#159。 [Kintyre]

  • 为CRON语法可能有效但某些功能组合不受支持的情况创建CroniterUnsupportedSyntaxError异常。目前,当day_of_week组件同时具有文字值和nth/last语法时使用此异常。例如,0 0 * * 1,L60 0 * * 15,sat#1都将引发此异常,因为混合了文字星期和nth-weekday或last-weekday语法。这可能会影响先前的版本中的现有cron表达式,因为0 0 * * 15,sat#1之前是允许的,但处理不正确。 [Kintyre]

  • 更新croniter_range()以允许使用替代的croniter类。当使用从croniter派生的自定义类时很有用。 [Kintyre]

1.0.10 (2021-03-25)

  • 移除外部库natsort。现在使用自定义key函数的sorted()处理cron表达式组件的排序。 [Kintyre]

1.0.9 (2021-03-23)

  • 移除futures依赖 [kiorky]

1.0.8 (2021-03-06)

  • 更新

    1.0.7 (2021-03-02)

    • 修复_expand以拒绝带下划线的整型文字 [cuu508]

    • 移除一个调试语句以使flake8满意 [cuu508]

1.0.6 (2021-02-01)

  • 修复星号和无效表达式组合的bug [kiorky]

1.0.5 (2021-01-29)

  • 安全修复:修复使用cron范围时的溢出 [kiorky]

1.0.4 (2021-01-29)

  • 拼写修复发布

1.0.3 (2021-01-29)

  • 修复#155:当错误语法时引发CroniterBadCronError [kiorky]

1.0.2 (2021-01-19)

  • 修复当datetime有微秒时的匹配问题 [kiorky]

1.0.1 (2021-01-06)

  • 没有更改,只是为了与新semver2兼容(使croniter处于稳定状态) [kiorky]

0.3.37 (2020-12-31)

  • 添加Python 3.8和3.9支持 [eumiro]

0.3.36 (2020-11-02)

  • 更新有关max_years_between_matches的文档部分,使其更简短且更有相关性。 [Kintyre]

  • 不要安装测试 [scop]

0.3.35 (2020-10-11)

  • 处理范围中的L。这解决了#142。 [kiorky]

  • 添加新的初始化参数 max_years_between_matches 以支持查找超出默认 1 年窗口的下一个/上一个日期,如果需要的话。更新 README 以包含有关此用法的额外说明和示例。修复 #145。[Kintyre]

  • 更新了 croniter_range() 函数,使其自动确定合适的 max_years_between_matches 值,从而避免处理 CroniterBadDateError 异常。[Kintyre]

  • 更新了异常处理类:现在 CroniterBadDateError 仅在日期查找操作(下一个/上一个)期间应用,并且现在可以使用 CroniterBadCronError 捕获所有解析错误。现在 CroniterNotAlphaError 异常是 CroniterBadCronError 的子类。为每个异常类添加了简短的描述作为内联文档字符串。[Kintyre]

  • 更新了可迭代接口,将 CroniterBadDateError 替换为 StopIteration,前提是(并且仅当)提供 max_years_between_matches 参数。这里的理由是,如果用户指定了匹配之间的最大容忍度,那么就无需进一步通知他们没有更多的匹配。只需停止迭代即可。这也保持了向后兼容性。[Kintyre]

  • 小幅度更新文档 [Kintyre]

0.3.34 (2020-06-19)

  • 特性 croniter_range(start, stop, cron) [Kintyre]

  • 优化了编写不良的 cron 表达式 [Kintyre]

0.3.33 (2020-06-15)

  • 使 dateutil tz 的支持更加官方 [Kintyre]

  • 特性/支持天或 [田口信元]

0.3.32 (2020-05-27)

  • 记录秒的重复,修复 #122 [kiorky]

  • 实现匹配方法,修复 #54 [kiorky]

  • 为 #127 添加测试(测试更多 DSTs 和 croniter 附近的行为)[kiorky]

  • 将 lag_hours 的比较改为绝对值,以便在获取上一个时管理 DST 边界 [Sokkka]

0.3.31 (2020-01-02)

  • 修复 get_next(),当 start_time 小于 1 秒前下一个瞬间时 [AlexHill]

0.3.30 (2019-04-20)

  • 致谢

0.3.29 (2019-03-26)

  • 致谢

  • 历史剥离(安全)

  • 处理 -Sun 语法,这修复了 #119。[kiorky]

  • 正确处理无效的范围,这修复了 #114。[kiorky]

0.3.25 (2018-08-07)

  • Pypi 卫生 [hugovk]

0.3.24 (2018-06-20)

  • 修复 #107:微秒阈值 [kiorky]

0.3.23 (2018-05-23)

0.3.22 (2018-05-16)

  • 如果代码从基于 5 星号的 cron 触发,不要计算上一个分钟。如果现在是基于 datetime.now()get_prev,则期望返回当前的 cron 迭代而不是上一个执行。[Igor Khrol <igor.khrol@toptal.com>]

0.3.20 (2017-11-06)

0.3.19 (2017-08-31)

  • 修复 #87:向后 DST 变化 [kiorky]

0.3.18 (2017-08-31)

0.3.17 (2017-05-22)

0.3.16 (2017-03-15)

0.3.15 (2017-02-16)

  • 修复 _get_prev_nearest_diff 中多个条件和 range_val 的错误。[abeja-yuki@github]

0.3.14 (2017-01-25)

  • 问题 #69:添加 day_or 选项以更改当提供 day-of-month 和 day-of-week 时的行为 [Andreas Vogl <a.vogl@hackner-security.com>]

0.3.13 (2016-11-01)

0.3.12 (2016-03-10)

0.3.11 (2016-01-13)

  • 错误修复:当使用月底标记时,get_prev API崩溃。缺少一些基本逻辑。[Iddo Aviram <iddo.aviram@similarweb.com>]

0.3.10 (2015-11-29)

  • 由于月份变量没有正确更新,'l'(月份的日)作为月份的功能已损坏。[Iddo Aviram <iddo.aviram@similarweb.com>]

0.3.9 (2015-11-19)

  • 不要使用datetime函数,Python 2.6不支持 [petervtzand]

0.3.8 (2015-06-23)

  • 通过设置为0截断微秒 [Corey Wright]

0.3.7 (2015-06-01)

  • 将范围sun-thu转换为int 0,它被识别为空字符串;解决方案是将sun转换为字符串“0”

0.3.6 (2015-05-29)

  • 修复未提供start_time时的默认行为 start_time参数的默认值在模块初始化时计算,而不是在调用时计算。

  • 修复时区支持,并停止依赖于系统时区

0.3.5 (2014-08-01)

  • 支持“l”(月底)

0.3.4 (2014-01-30)

  • Python 3兼容性

  • QA发布

0.3.3 (2012-09-29)

  • 适当的打包

项目详情


发布历史 发布通知 | RSS源

下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

croniter-3.0.3.tar.gz (53.1 kB 查看哈希值)

上传时间 源代码

构建分发

croniter-3.0.3-py2.py3-none-any.whl (22.4 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下支持