在Python中解析人类可读的重复日期
问题。 在我的Django应用中,用户可以创建任务来安排执行时间。这些用户技术水平不高,如果他们能用简单易懂的表达方式来定义任务的执行时间就太好了,比如:
- 每周一
- 每周五、周三
- 每天
- 每个月的1号、14号和20号
- 每周五;每个月的最后一天
这个想法受到了Todoist的启发。目前只需要处理日期,不需要具体的时间。我花了几个小时在网上搜索相关的库,但没有找到合适的。我希望能有一个函数,比如说in_range(expression, date)
,可以这样使用:
>>> in_range('every monday, wednesday', date(2014, 4, 28))
True
>>> in_range('every end of month', date(2014, 5, 12))
False
>>> in_range('every millenium', date(2014, 5, 8))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: unknown token "millenium".
变体。 这是我查找过的内容。
- 标准的
datetime
库可以解析日期,但不能像上面那样解析日期范围。 - Python-dateutil - 支持通过
rrule
来处理重复日期,功能很强大,但仍然不支持解析。 - Python-crontab和Python-croniter接受标准的Unix crontab语法(并允许指定星期几等),但这种语法太过技术化,我希望能避免使用。
- Arrow和Parsedatetime都不支持这个功能。
所以,有没有我遗漏的Python代码片段或库可以实现这个功能?如果没有,我打算自己写一个解析器。如果效果不错,我希望能把它开源出来。
1 个回答
7
Recurrent 是一个可以解析自然语言中日期的库,它支持重复的日期。虽然它的接口和你提供的不同,但它允许你创建一些规则,这些规则可以和 Python 的 datetime
库一起使用。
来自他们的 Github 页面:
自然语言解析日期和重复事件
示例
日期和时间
- 下周二
- 明天
- 一个小时后
重复事件
- 在工作日
- 从2010年1月1日到2020年12月25日,每个月的第四天
- 每周四直到下个月
- 每年11月的第四个星期四
- 每周二和周四的下午3:15
复杂的字符串
- 请安排会议在每隔一个星期二的中午
- 设置一个闹钟在下周二晚上11点