私はいくつかの ical 問題を扱っています。
私は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 があります。
この ical を icalendar で解析しました。
私は使用しています:
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" です。
2 番目の問題は、12 月 25 日が、EXDATE で指定されたスキップされるのではなく、このリストに含まれていることです。exdate ルールの夏時間が正しく計算されているため、exdate 19:00:00+01:00 が計算された繰り返し時間の 19:00:00+02:00 と一致しませんでした。
私はそこで何か間違ったことをしていますか?
17:00:00 UTC は 18:00:00 UTC とも一致しないため、すべてを UTC に変換してそこで処理しても役に立ちません。