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

时间:2014-04-26 15:19:48

标签: python django date python-dateutil python-datetime

问题。在我的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语法(并允许指定工作日等),但是这种语法仍然过于技术化,我想尽可能避免使用它。< / LI>
  • ArrowParsedatetime不支持该功能。

那么,是否有Python代码片段或我错过的库来做这件事?如果没有,我将自己编写解析器。如果看起来不是太糟糕的话,想在开源版本中发布它。

1 个答案:

答案 0 :(得分:4)

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

从他们的Github页面

  

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

     

实施例

     

日期时间

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

重复发生的事件

     
      
  • 在工作日
  •   
  • 从2010年1月1日到2020年12月25日的每月四分之一
  •   
  • 每个月到下个月
  •   
  • 每年11月的第四个星期四。
  •   
  • 星期二和星期四3点15分
  •   
     

凌乱的字符串

     
      
  • 请在周二中午每隔一天安排一次会议
  •   
  • 下周二晚上11点设置闹钟
  •