2012-06-06 58 views
2

我正在使用Python,但我不認爲這是相關的。下面的iCal代碼片段來自Outlook 2010導出(完整數據)。在Outlook中,該事件顯示爲重複發生,包括2012年4月12日的事件實例。如果打開該系列,則說從Outlook解析iCal:我如何知道該事件的重複計劃?

重複:每個星期四發生從2012年3月29日下午12:00開始生效至12:30 PM

我的問題是:是否可以從下面的信息中推導出重複計劃?哪些字段會給我提供信息?我期望能找到一個RRULE,但是這裏沒有這種東西。

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 

回答

2

我通過您的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')) 

再次發生規則是空的輸出,這看起來幾乎比如重新發生事件的單個實例,但最終還是針對各種Microsoft特定數據。它的序列號爲8,X-MS-OLK-APPTLASTSEQUENCE:16表示最後一個實例應該有序列16.

它幾乎看起來像創建了多個具有相同UID的每個組上的序列標記的實例

+0

這幾乎是在那裏我landing--,但它並不完全意義either--因爲我把這個從日曆的完整的出口(在Outlook的導出屏幕中,我從日期範圍下拉菜單中選擇了「整個日曆」) –

+1

將蘋果導入蘋果的iCal(嘆息),該事件僅在3月29日出現 - 這至少讓我感覺不那麼笨。 –

+0

@Ross M Karchner:我猜可能會發生。它不是使用RRULE,而是使事件扁平化,並添加非標準的Microsoft特定信息來關聯所有這些事件。 – pyfunc

0

你嘗試用vba導出日曆嗎?這可能是你的選擇。你必須注意Item.GetRecurrencePattern(Item被聲明爲myItem As AppointmentItem),然後與olRecursMonthly,olRecursYearly進行比較,然後查找項目的間隔和計數屬性以重建整個rrule字符串。

,你會發現在這個項目的更多細節:http://sourceforge.net/projects/outlook2ical/files/outlook2ical/v1.04/

+0

今天我試了這個 - 感謝這個主意! –