提问人:Estartu 提问时间:5/29/2015 最后编辑:Peter WoodEstartu 更新时间:5/29/2015 访问量:749
如何匹配 dateuilts.rrule 和 python icalendar 夏令时感知
How to match dateuilts.rrule and python icalendar daylightsavingtime aware
问:
我正在处理一些问题。
我有一个活动。
BEGIN:VEVENT
UID:Event/termine/gps/[email protected]
DTSTART;TZID=CET:20150529T190000
DTEND;TZID=CET:20150529T220000
CATEGORIES:Arbeitsgruppe
DTSTAMP:20110620T075538Z
EXDATE;TZID=CET:20151225T190000
LAST-MODIFIED:20150424T201707Z
LOCATION:Vereinsräume des Augsburger Computer Forum e.V.
PRIORITY:5
RRULE:FREQ=MONTHLY;BYDAY=-1FR
SUMMARY:GPS-Arbeitsgruppe
URL:https://www.augusta.de/termine/gps
END:VEVENT
正如你所看到的,每个月的最后一个星期五都会有一个 RRule 重复这个事件。
我用 icalendar 解析了这个 ical。
我正在使用:
start = iobj.get( 'DTSTART' ).dt
rrset = rruleset()
rrule = iobj.get( 'RRULE' )
exdate = iobj.get( 'EXDATE' )
rrset.rrule( rrule.rrulestr( rule.to_ical(), dtstart = start ) )
for edate in exdate.dts :
rrset.exdate( edate.dt )
到目前为止,一切都很好。
当我尝试获得下一个说 10 个日期时:
list(rrset)[:10]
我得到:
[datetime.datetime(2015, 5, 29, 19, 0, tzinfo=<DstTzInfo 'CET' CEST+2:00:00 DST>),
datetime.datetime(2015, 6, 26, 19, 0, tzinfo=<DstTzInfo 'CET' CEST+2:00:00 DST>),
datetime.datetime(2015, 7, 31, 19, 0, tzinfo=<DstTzInfo 'CET' CEST+2:00:00 DST>),
datetime.datetime(2015, 8, 28, 19, 0, tzinfo=<DstTzInfo 'CET' CEST+2:00:00 DST>),
datetime.datetime(2015, 9, 25, 19, 0, tzinfo=<DstTzInfo 'CET' CEST+2:00:00 DST>),
datetime.datetime(2015, 10, 30, 19, 0, tzinfo=<DstTzInfo 'CET' CEST+2:00:00 DST>),
datetime.datetime(2015, 11, 27, 19, 0, tzinfo=<DstTzInfo 'CET' CEST+2:00:00 DST>),
datetime.datetime(2015, 12, 25, 19, 0, tzinfo=<DstTzInfo 'CET' CEST+2:00:00 DST>),
datetime.datetime(2016, 1, 29, 19, 0, tzinfo=<DstTzInfo 'CET' CEST+2:00:00 DST>),
datetime.datetime(2016, 2, 26, 19, 0, tzinfo=<DstTzInfo 'CET' CEST+2:00:00 DST>)]
乍一看似乎没问题,但更深入地检查,从 10 月 30 日开始出现问题,夏令时结束于 10 月 25 日,但 datetime 对象的 tzinfo 信息仍然是“DstTzInfo 'CET' CEST+2:00:00 DST”
第二个问题是 12 月 25 日在此列表中,而不是在 EXDATE 中指定跳过。解析 exdate 规则夏令时要解决的问题接缝计算正确,因此 exdate 19:00:00+01:00 与计算的重复时间 19:00:00+02:00 不匹配。
我在那里做错了什么吗?
将所有内容转换为 UTC 并在那里进行处理无济于事,因为 17:00:00 UTC 也不匹配 18:00:00 UTC。
答: 暂无答案
评论
dateutils