如何匹配dateuilts.rrule和python icalendar daylightsavingtime意识到

时间:2015-05-29 14:20:50

标签: python date datetime icalendar rrule

我正在处理一些琐事。

我有一个ical事件。

BEGIN:VEVENT
UID:Event/termine/gps/akt@portal.augusta.de 
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不匹配。

0 个答案:

没有答案