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

Ana*_*kov 5 python django date python-datetime python-dateutil

问题。在我的 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".
Run Code Online (Sandbox Code Playgroud)

变体。这就是我看过的。

  • 标准datetime库进行日期解析,但不进行上述日期范围解析。
  • Python-dateutil - 通过 支持重复日期rrule,非常实用,但仍然不支持解析。
  • Python-crontabPython-croniter接受标准的 Unix crontab 语法(并允许指定工作日等),但这种语法仍然过于技术性,如果可能,我想避免它。
  • ArrowParsedatetime不支持该功能。

那么,是否有我错过的 Python 代码片段或库来做这件事?如果没有,我将自己编写解析器。如果它看起来还不错,我想以开源方式发布它。

Dar*_*ehe 7

Recurrent是一个支持重复日期的自然语言日期解析库。它与您提供的 API 不匹配,但允许您创建可与 Pythondatetime库一起使用的规则。

从他们的 Github 页面:

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

例子

日期时间

  • 下个星期二
  • 明天
  • 在一个小时之内

重复事件

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

凌乱的弦

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