我正在寻找能够迭代重复的iCal事件并自动处理特定实例的库(最好是Python,但语言无关紧要).
我正在使用的iCal文件包含重复发生的事件(例如:) RRULE:FREQ=WEEKLY;UNTIL=20150614;BYDAY=MO,TU,WE,TH,FR.这些重复发生的事件有时会有特定的实例:可能会针对单个事件更改摘要,或者删除一个事件.这导致VEVENTiCal文件中的s具有类似RECURRENCE-ID和的属性EXDATE.
我看过的大多数iCal库(python-icalendar,ical.js,php iCalCreator)都可以帮助你进行解析,但只会VEVENT为所有特定实例返回单独的(和非分组的)s.这意味着您必须将它们与相关的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'},
]
Run Code Online (Sandbox Code Playgroud)
Python 库recurring-ical-events根据 RFC5455 重复展开事件。
pip install recurring-ical-events
Run Code Online (Sandbox Code Playgroud)
例子:
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))
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
旧答案:
从斯文的回答来看,
dateutil.rrule声称处理 ICalendar RFC 5545 中的规则。如果您查看示例,它会提供datetime对象。
| 归档时间: |
|
| 查看次数: |
423 次 |
| 最近记录: |