iCal 库用特定实例迭代重复发生的事件

iCal library to iterate recurring events with specific instances

我正在寻找一个能够迭代重复出现的 iCal 事件并自动处理特定实例的库(最好是 Python,但语言并不重要)。

我正在使用的 iCal 文件包含重复事件(例如:RRULE:FREQ=WEEKLY;UNTIL=20150614;BYDAY=MO,TU,WE,TH,FR)。这些重复发生的事件有时有特定的实例:可能会针对单个事件更改摘要,或者删除一个事件。这导致 iCal 文件中的 VEVENTs 具有 RECURRENCE-IDEXDATE.

等属性

我看过的大多数 iCal 库(python-icalendar、ical.js、php iCalCreator)都会帮助您进行解析,但只会 return 为所有特定实例单独(和非分组)VEVENTs。这意味着您必须自己将它们与相关的 RRULE 相匹配,并确定这如何影响 RRULE.

因此,让我们假设周一至周五从 9:00-10:00 发生的重复事件。但是在星期五 (10:00-11:00) 有一个特定实例,在星期三有一个已删除的实例。在这种情况下,我想以这样的方式迭代事件:

[
  {start: '2015-06-15 09:00:00', end: '2015-06-15 10:00:00'},
  {start: '2015-06-16 09:00:00', end: '2015-06-16 10:00:00'},
  {start: '2015-06-18 09:00:00', end: '2015-06-18 10:00:00'},
  {start: '2015-06-19 10:00:00', end: '2015-06-19 11:00:00'},
]

Python 库 recurring-ical-events 根据 RFC5455 重复展开事件。

pip install recurring-ical-events

示例:

import icalendar
import datetime
import recurring_ical_events
import urllib.request

start_date = (2019, 3, 5)
end_date =   (2019, 4, 1)
url = "https://raw.githubusercontent.com/niccokunzmann/python-recurring-ical-events/master/test/calendars/recurring-events-changed-duration.ics"

ical_string = urllib.request.urlopen(url).read()
calendar = icalendar.Calendar.from_ical(ical_string)
events = recurring_ical_events.of(calendar).between(start_date, end_date)
for event in events:
    start = event["DTSTART"].dt
    duration = event["DTEND"].dt - event["DTSTART"].dt
    print("start {} duration {}".format(start, duration))

输出:

start 2019-03-18 04:00:00+01:00 duration 1:00:00
start 2019-03-20 04:00:00+01:00 duration 1:00:00
start 2019-03-19 04:00:00+01:00 duration 1:00:00
start 2019-03-07 02:00:00+01:00 duration 1:00:00
start 2019-03-08 01:00:00+01:00 duration 2:00:00
start 2019-03-09 03:00:00+01:00 duration 0:30:00
start 2019-03-10 duration 1 day, 0:00:00

旧答案:

来自answer of Sven,

dateutil.rrule 声称处理 ICalendar RFC 5545 中的规则。如果您查看这些示例,它会提供 datetime 个对象。