在Python中解析人类可读的重复日期

5 投票
1 回答
1943 浏览
提问于 2025-04-18 04:22

问题。 在我的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-crontabPython-croniter接受标准的Unix crontab语法(并允许指定星期几等),但这种语法太过技术化,我希望能避免使用。
  • ArrowParsedatetime都不支持这个功能。

所以,有没有我遗漏的Python代码片段或库可以实现这个功能?如果没有,我打算自己写一个解析器。如果效果不错,我希望能把它开源出来。

1 个回答

7

Recurrent 是一个可以解析自然语言中日期的库,它支持重复的日期。虽然它的接口和你提供的不同,但它允许你创建一些规则,这些规则可以和 Python 的 datetime 库一起使用。

来自他们的 Github 页面:

自然语言解析日期和重复事件

示例

日期和时间

  • 下周二
  • 明天
  • 一个小时后

重复事件

  • 在工作日
  • 从2010年1月1日到2020年12月25日,每个月的第四天
  • 每周四直到下个月
  • 每年11月的第四个星期四
  • 每周二和周四的下午3:15

复杂的字符串

  • 请安排会议在每隔一个星期二的中午
  • 设置一个闹钟在下周二晚上11点

撰写回答