从Outlook解析iCal:如何判断此事件的定期计划是什么?

从Outlook解析iCal:如何判断此事件的定期计划是什么?,outlook,icalendar,rfc2445,rfc5545,Outlook,Icalendar,Rfc2445,Rfc5545,我正在使用Python,但我认为这与本文无关。下面的iCal代码段来自Outlook 2010导出(完整数据)。在Outlook中,事件显示为重复发生,包括2012年4月12日事件的一个实例。如果你打开这个系列,它会说 复发:自2012年3月29日下午12:00至12:30每周四发生 我的问题是:是否有可能从下面的信息中得出定期计划?哪些字段将为我提供信息?我希望能找到一个垃圾桶,但这里没有这样的东西 BEGIN:VEVENT CLASS:PUBLIC CREATED:20120312T1333

我正在使用Python,但我认为这与本文无关。下面的iCal代码段来自Outlook 2010导出(完整数据)。在Outlook中,事件显示为重复发生,包括2012年4月12日事件的一个实例。如果你打开这个系列,它会说

复发:自2012年3月29日下午12:00至12:30每周四发生

我的问题是:是否有可能从下面的信息中得出定期计划?哪些字段将为我提供信息?我希望能找到一个垃圾桶,但这里没有这样的东西

BEGIN:VEVENT
CLASS:PUBLIC
CREATED:20120312T133301Z
DESCRIPTION:\n
DTEND;TZID="Eastern Standard Time":20120329T123000
DTSTAMP:20120411T220938Z
DTSTART;TZID="Eastern Standard Time":20120329T120000
LAST-MODIFIED:20120531T155022Z
LOCATION:1501 Fake Street\, Conference Room G
PRIORITY:5
RECURRENCE-ID;TZID="Eastern Standard Time":20120419T120000
SEQUENCE:8
SUMMARY;LANGUAGE=en-us:My Cool Event
TRANSP:OPAQUE
UID:040000008200E00074C5B7101A82E008000000000029934B3300CD01000000000000000
    0100000001516438BA45C3946AF9C4C2A563FB2BE
X-ALT-DESC;FMTTYPE=text/html:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//E
    N">\n<HTML>\n<HEAD>\n<META NAME="Generator" CONTENT="MS Exchange Server ve
    rsion 14.02.5004.000">\n<TITLE></TITLE>\n</HEAD>\n<BODY>\n<!-- Converted f
    rom text/rtf format -->\n\n<P DIR=LTR><SPAN LANG="en-us"></SPAN><SPAN LANG
    ="en-us"></SPAN></P>\n\n</BODY>\n</HTML>
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-APPTLASTSEQUENCE:16
X-MS-OLK-APPTSEQTIME:20120411T220937Z
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
类别:公共
创建日期:20120312T133301Z
说明:\n
数据终端;TZID=“东部标准时间”:20120329T123000
DTSTAMP:20120411T220938Z
DTSTART;TZID=“东部标准时间”:20120329T120000
最后修改:20120531T155022Z
地点:假街1501号G会议室
优先次序:5
复发性ID;TZID=“东部标准时间”:20120419T120000
顺序:8
总结;语言=美国:我的酷事件
运输:不透明
UID:0400000008200E00074C5B7101A82E00800000000029934B3300CD010000000000
0100000001516438BA45C3946AF9C4C2A563FB2BE
X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

\n\n\n X-MICROSOFT-CDO-BUSYSTATUS:忙 X-MICROSOFT-CDO-重要性:1 X-MICROSOFT-DISALLOW-COUNTER:FALSE X-MS-OLK-APPTLASTSEQUENCE:16 X-MS-OLK-APPTSEQTIME:20120411T220937Z X-MS-OLK-AUTOFILLLOCATION:错误 X-MS-OLK-CONFTYPE:0 完:维文特
我用以下程序浏览了您的ICS文件:

from icalendar import Calendar, Event
from datetime import datetime

cal = open('test.ics','rb')
ical = Calendar.from_ical(cal.read())
for component in ical.walk():
    if component.name == 'VEVENT':
        for item in component.sorted_items():

            if item[0] == 'RECURRENCE-ID':
                reoccur_item = item[1]
                print reoccur_item.params
                print reoccur_item.dt
                continue
            if item[0] == 'DTSTART':
                print 'DSTART', item[1].dt
                continue
            if item[0] == 'DTEND':
                print 'DTEND', item[1].dt
                continue
            if item[0] == 'DTSTAMP':
                print 'DTSTAMP', item[1].dt
                continue
            print item

cal.close()
下面是我得到的结果

('SUMMARY', vText(u'My Cool Event'))
DSTART 2012-03-29 12:00:00
DTEND 2012-03-29 12:30:00
DTSTAMP 2012-04-11 22:09:38+00:00
('UID', vText(u'040000008200E00074C5B7101A82E008000000000029934B3300CD01000000000000000   0100000001516438BA45C3946AF9C4C2A563FB2BE'))
RECURRENCE-ID Parameters({'TZID': 'Eastern Standard Time'})
RECURRENCE-ID 2012-04-19 12:00:00
('SEQUENCE', 8)
('CLASS', vText(u'PUBLIC'))
('CREATED', <icalendar.prop.vDDDTypes instance at 0x101c4e518>)
('DESCRIPTION', vText(u'\n'))
('LAST-MODIFIED', <icalendar.prop.vDDDTypes instance at 0x1020874d0>)
('LOCATION', vText(u'1501 Fake Street, Conference Room G'))
('PRIORITY', 5)
('TRANSP', vText(u'OPAQUE'))
('X-ALT-DESC', vText(u'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//E   N">\n<HTML>\n<HEAD>\n<META NAME="Generator" CONTENT="MS Exchange Server ve   rsion 14.02.5004.000">\n<TITLE></TITLE>\n</HEAD>\n<BODY>\n<!-- Converted f   rom text/rtf format -->\n\n<P DIR=LTR><SPAN LANG="en-us"></SPAN><SPAN LANG   ="en-us"></SPAN></P>\n\n</BODY>\n</HTML>'))
('X-MICROSOFT-CDO-BUSYSTATUS', vText(u'BUSY'))
('X-MICROSOFT-CDO-IMPORTANCE', vText(u'1'))
('X-MICROSOFT-DISALLOW-COUNTER', vText(u'FALSE'))
('X-MS-OLK-APPTLASTSEQUENCE', vText(u'16'))
('X-MS-OLK-APPTSEQTIME', vText(u'20120411T220937Z'))
('X-MS-OLK-AUTOFILLLOCATION', vText(u'FALSE'))
('X-MS-OLK-CONFTYPE', vText(u'0'))
('SUMMARY',vText(我的酷事件)'))
DSTART 2012-03-29 12:00:00
DTEND 2012-03-29 12:30:00
DTSTAMP 2012-04-11 22:09:38+00:00
('UID',vText(u'0400000008200E00074C5B7101A82E00800000000029934B3300CD01000000000000000 0100000001516438BA45C3946AF9C4C2A563FB2BE'))
递归ID参数({'TZID':'Eastern Standard Time'})
复发日期:2012-04-19 12:00:00
(‘顺序’,8)
('CLASS',vText(u'PUBLIC'))
(‘已创建’,)
('DESCRIPTION',vText(u'\n'))
(‘最后修改’,)
('LOCATION',vText(u'1501 Fake Street,G会议室'))
(“优先权”,5)
('TRANSP',vText(u'不透明'))
('X-ALT-DESC',vText(u'\n\n\n\n\n\n\n\n

\n\n\n')) ('X-MICROSOFT-CDO-BUSYSTATUS',vText(u'BUSY')) ('X-MICROSOFT-CDO-important',vText(u'1')) ('X-MICROSOFT-DISALLOW-COUNTER',vText(u'FALSE')) ('X-MS-OLK-APPTLASTSEQUENCE',vText(u'16')) ('X-MS-OLK-APPTSEQTIME',vText(u'20120411T220937Z')) ('X-MS-OLK-AUTOFILLLOCATION',vText(u'FALSE')) ('X-MS-OLK-CONFTYPE',vText(u'0'))
重新出现规则为空,看起来几乎像是重新出现事件的单个实例,但最终是针对各种Microsoft特定数据。序列号为8,X-MS-OLK-APPTLASTSEQUENCE:16表示最后一个实例应该具有序列16


它几乎像是在每个团队中使用相同的UID创建了多个带有序列戳的实例

您是否尝试使用vba导出日历?这可能是您获取rrule的一个选项。您必须监视Item.GetRecurrencePattern(将项声明为myItem作为AppointmentItem),并与olRecursMonthly、olRecursYearly等进行比较。。。然后查找项目的间隔和计数属性,以重新生成整个rrule字符串


您可以在该项目中找到更多详细信息:

这正是我要登陆的地方——但也没有什么意义——因为我是从日历的完整导出(在Outlook的导出屏幕中,我从日期范围下拉列表中选择了“整个日历”)将ical导入苹果的ical(叹气)而这个事件只出现在3月29日——这至少让我感觉不那么愚蠢了。@Ross M Karchner:我可以猜到会发生这样的事情。它没有使用RRULE,而是将事件展平,并添加非标准的Microsoft特定信息,用于关联所有这些事件。