一个python模块,通过rrule、rdate和exdate重复iCalendar事件。
recurring-ical-events的Python项目详细描述
让我们把我们的专业知识放在一起,建立一个可以解决这个问题的工具!
- 日间节约时间(完成)
- 重复事件(完成)
- 具有编辑功能的重复事件(完成)
- 省略事件的重复事件(完成)
- 以后编辑发生的重复事件(完成)
- 正常事件(完成)
- 日期的重复,但不是小时、分钟和更小的(完成)
- 无休止重复(完成)
- 结束重复(完成)
- 具有开始日期和无结束日期的事件(完成)
- 开始为日期和开始为日期时间的事件(完成)
- RRULE(完成)
- RDATE(完成)
- DURATION(完成)
- EXDATE(完成)
不包括:
- exrule(已弃用),请参见8.3.2. Properties Registry
安装
pip install python-recurring-ical-events
示例
importicalendarimportrecurring_ical_eventsimporturllib.requeststart_date=(2019,3,5)end_date=(2019,4,1)url="http://tinyurl.com/y24m3r8f"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)foreventinevents:start=event["DTSTART"].dtduration=event["DTEND"].dt-event["DTSTART"].dtprint("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
用法
icalendar模块负责解析和转换日历。 recurring_ical_events模块使用这样的日历,并在一个时间范围内创建其事件的所有重复。
要导入此模块,请编写
importrecurring_ical_events
有几种方法可用于展开重复事件,例如at(a_time)和between(a_start, an_end)。
at(a_date)
您可以获取在a_date发生的所有事件。 日期可以是一年,例如2023,一年中的一个月,例如2023年的1月(2023, 1),某个月的一天,例如(2023, 1, 1),一小时,例如(2023, 1, 1, 0),一分钟,例如(2023, 1, 1, 0, 0),或者秒,也可以是datetime.date对象和datetime.datetime。
开始和结束都包含在内。举个例子:如果一个事件超过一天,如果它发生在a_date,那么它仍然包括在内。
a_date=2023# a yeara_date=(2023,1)# January in 2023a_date=(2023,1,1)# the 1st of January in 2023a_date=(2023,1,1,0)# the first hour of the year 2023a_date=(2023,1,1,0,0)# the first minute in 2023a_date=datetime.date(2023)# the first day in 2023a_date=datetime.date(2023,1,1)# the first day in 2023events=recurring_ical_events.of(an_icalendar_object).at(a_date)
生成的events是iCalendar事件的列表,请参见下文。
between(start, end)
between(start, end)返回开始时间和结束时间之间发生的所有事件。这两个参数都可以是datetime.datetime、datetime.date、作为参数传递给datetime.datetime的数字元组或以下形式的字符串 %Y%m%d(yyyymmdd)和%Y%m%dT%H%M%SZ(yyyymmddThhmmssZ)。 例如,请参见上面的at(a_date)。
events=recurring_ical_events.of(an_icalendar_object).between(start,end)
结果events在一个列表中,请参见下文。
eventsas列表
between(start, end)和at(a_date)的结果是icalendar事件的列表。 默认情况下,会复制具有重复的事件的所有属性,如uid和summary。 但是,这些属性可能与源事件不同:
- dtstart,它是事件实例的开始。
- 事件实例的结尾。
- rdate、exdate、rrule是创建事件重复的规则。如果包含它们,则未定义。未来的需求可能会消除它们。如果您想包含它们,请编写一个测试或open an issue。
开发
- 可选:安装virtualenv和python3并创建一个虚拟环境。
virtualenv -p python3 ENV source ENV/bin/activate
- 安装软件包。
pip install -r requirements.txt -r test-requirements.txt
- 运行测试
pytest
要发布新版本,请编辑setup.py,__version__变量并运行
python3 setup.py tag_and_deploy
测试
这个项目的开发是由测试驱动的。 您可以在test folder中查看测试 如果您有一个日历ICS文件,而此库没有 生成所需的输出,可以将其添加到test/calendars 为您所期望的内容进行文件夹和编写测试。 如果你喜欢,open an issue首先,例如讨论更改和 怎么做。
研究
- RFC 5545
- Stackoverflow question this is created for
- https://github.com/oberron/annum -https://stackoverflow.com/questions/28829261/python-ical-get-events-for-a-day-including-recurring-ones#28829401
- https://stackoverflow.com/questions/20268204/ical-get-date-from-recurring-event-by-rrule-and-dtstart
- https://github.com/collective/icalendar/issues/162
- https://stackoverflow.com/questions/46471852/ical-parsing-reoccuring-events-in-python