python icalendar 正确设置 dtstart

2 投票
3 回答
3055 浏览
提问于 2025-04-20 13:22

我正在用Python和一个叫做 iCalendar 的库,写一个脚本来把一堆冰球赛程格式化成.ics文件。

当我设置如下时:

event.add('dtstart', game_datetime[i])
event.add('dtend', game_datetime[i]+timedelta(hours=i))

我在生成的.ics文件中得到了以下内容:

DTSTART;VALUE=DATE-TIME:20141019T140500
DTEND;VALUE=DATE-TIME:20141019T160500

这显然不太理想;看起来是把对象传过去了,而不是它的值。所以当我尝试用strftime()这样设置时:

#event.add('dtstart', game_datetime[i].strftime('%Y%m%dT%H%M%SZ'))
#event.add('dtend', (game_datetime[i]+timedelta(hours=i)).strftime('%Y%m%dT%H%M%SZ'))

我收到了以下错误:

File "D:\schedule_format.py", line 72, in <module>
event.add('dtstart', game_datetime[i].strftime('%Y%m%dT%H%M%SZ'))
File "C:\Python27\lib\site-packages\icalendar-3.9.dev0-py2.7.egg\icalendar\cal.py", line 171, in add
value = self._encode(name, value, parameters, encode)
File "C:\Python27\lib\site-packages\icalendar-3.9.dev0-py2.7.egg\icalendar\cal.py", line 123, in _encode
obj = klass(value)
File "C:\Python27\lib\site-packages\icalendar-3.9.dev0-py2.7.egg\icalendar\prop.py", line 276, in __init__
raise ValueError('You must use datetime, date, timedelta or time')
ValueError: You must use datetime, date, timedelta or time

所以很明显,我应该使用一个日期时间对象,但看起来我没有正确使用它?

3 个回答

0

我不太明白你觉得有什么问题:

RFC5545 的第3.3.5节([链接][1])中提到:

值名称: DATE-TIME

目的: 这个值类型用来表示一个具体的日历日期和时间。

格式定义: 这个值类型的定义如下:

  date-time  = date "T" time ;As specified in the DATE and TIME
                              ;value definitions

[...] 例如,下面的表示的是1998年1月18日晚上11点:

19980118T230000

这看起来和iCalendar生成的内容非常相似(而且也很正常)。

如果你有具体的问题,可以详细说明一下你想要的输出吗?

[1]: https://www.rfc-editor.org/rfc/rfc5545#section-3.3.5

2

你可以在Python的日期时间对象上使用icalendar包里的vDatetime函数。

from icalendar import Calendar, Event, vDatetime
event.add('dtstart', vDatetime(starttime))
0

我不知道你在game_datetime里放了什么,但我遇到过和你一样的问题。我是这样处理日期类型的属性的,效果很好:

from time import strftime,gmtime
from icalendar import Calendar,Parameters,Todo
import icalendar
from datetime import *

year = int(strftime("%Y", gmtime()))
month = int(strftime("%m", gmtime()))
day = int(strftime("%d", gmtime()))
hour = int(strftime("%H", gmtime()))
minute = int(strftime("%M", gmtime()))
second = int(strftime("%S", gmtime()))

temp = Todo()
temp.add('CREATED',datetime(year,month,day,hour,minute,second))

你应该把'CREATED'改成你想要的日期类型。

撰写回答