ICalendar

iCalendar是“日曆資料交換”的標準。此標準有時指的是“iCal”，即蘋果公司的出品的一款同名日曆軟體，這個軟體也是此標準的一種實現方式。iCalendar允許使用者透過電子郵件的方式傳送“會議請求”或“任務”。收信人使用支援iCalendar郵件客戶端，便可以很方便地回應發件人，接受請求或另外提議一個新的會議時間。iCalendar已得到很多產品的支援。通常情況下，iCalendar資料是使用電子郵件交換，但它也可以獨立使用，而不侷限於某種傳輸協議。例如，可以透過WebDav伺服器或SyncML來進行共享與修改。簡單的網頁伺服器歷史與設計.iCalendar是由網際網路工程任務組的日曆與計劃工作組設計。以.ics為字尾名的檔案，表示該檔案包含 了空閒和忙碌時間資訊。通常iCalendar使用UTF-8字元編碼；但也可以使用MIME中的charset引數來指其它的字元編碼。在iCalendar檔案中，每一行必須以CR+LF來表示。iCalendar的MIME型別被定義為"text/calendar"。侷限和發展.iCalendar格式只是被設計用來傳送日曆和計劃表資料，如事件；而故意沒有定義操作這些資料的行為。因為，在編寫程式時需要協商如何操作它們。iCalendar本意是提供一種公共格式來定義開放的網際網路可交換的日曆和計劃表資料。當這些特性被廣泛支援應用後，很多效能問題逐漸顯現出來了。比如，大多數應用都不支援旅行。"在標準中，迴圈重復的會議有一些含糊不清，這導致在現有不同的應用之間仍然無法真正地互動。"iCalendar中的日曆無法相容非格里高利曆，比如以色列的希伯來曆和沙烏地阿拉伯的伊斯曆都是陰曆。“日曆訪問協議”備忘錄首次嘗試建立一個統一的建立實時日曆系統。可能是因為過於複雜，這個協議最終被放棄了。無論如何，像GroupDav和CalDAV這些基於iCalendar的協議已經越來越廣泛地應用在客戶端和服務端軟體包中了。網際網路工程任務組的日曆與計劃工作組 已經提交了關於iCalendar標準的附加修改提案。但這個工作組於2011年一月份被解散了。他們大部分工作重心轉移到了前一個標準的條款解釋。而後續的創新工作由日曆和計劃協會來完成。技術標準.核心物件.iCalendar中的頂級元素是日曆和計劃核心物件，一組日曆和計劃資訊。通常情況下，這些資訊應該只包含單一的iCalendar物件。但可以宣告一個組包含多個iCalendar物件。第一行必須是"BEGIN:VCALENDER"，最後一行必須是"END:VCALENDER"；兩行之間資料稱之為"icalbody"。icalbody由一系列日曆屬性和一個以上的日曆元件組成。日曆屬性被應用於整個日曆。日曆元件則是由若干日曆屬性描述成的一個日曆語義。比如，日曆元件可以指定一個事件、一個待辦事項列表、一個旅行事項、時區資訊、繁忙/空閒時間資訊，或者一個警報。在許多協議實現中不允許出現空行。下在是一個簡單的iCalendar物件示例，它描述了法國國慶日，即從1997年七月14日 17:00到1997年七月15日 03:59:59的巴士底日。BEGIN:VCALENDARVERSION:2.0PRODID:-//hacksw/handcal//NONSGML v1.0//ENBEGIN:VEVENTUID:uid1@example.comDTSTAMP:19970714T170000ZORGANIZER;CN=John Doe:MAILTO:john.doe@example.comDTSTART:19970714T170000ZDTEND:19970715T035959ZSUMMARY:Bastille Day PartyEND:VEVENTEND:VCALENDAR事件.VEVENT描述一個事件，在日曆上一系列計劃好的時間點。通常，當使用者接受一個日曆事件，這將導致在那個時間裡，使用者被認為是忙碌的。VEVENT可以包含一個VALARM物件來允許一個警報。事件應該有一個DTSTART來描述事件的開始時間，和一個DTEND來描述事件的結束時間。如果事件是迴圈的，則DTSTART應該設定第一個事件的開始時間。VEVENT同樣可以應用在沒有特定時間的日曆事件上，比如週年紀念日、每日提醒。如果你需要傳送取消事件的請求。那麼在請求中事件元件中，UID屬性應該與原事件一致並且，下面這些屬性應該設定成cancel。METHOD:CANCELSTATUS:CANCELLED為了傳送事件的更新請求，除了設定UID和其它更新屬性值外。還需要設定新序列值SEQUENCE:比如，第一個更新版本SEQUENCE:1在Microsoft Outlook中，SUMMARY屬性應當與"Appointment"中的"Subject"項一致，DESCRIPTION 屬性緊跟著SUBJECT屬性。另外，Outlook 2003要求指定UID和DTSTAMP屬性。待辦事項.VTODO描述一條待辦事項。下面的例子描述了一個應於1998年四月15日的待辦事項。屆時一個響鈴將會響起。在待辦事項完成前，將會一小時提醒一次，共提醒四次。SEQUENCE屬性顯示這條提醒在建立之後，還被修改了兩次。BEGIN:VCALENDARVERSION:2.0PRODID:-//ABC Corporation//NONSGML My Product//ENBEGIN:VTODODTSTAMP:19980130T134500ZSEQUENCE:2UID:uid4@host1.comACTION:AUDIOTRIGGER:19980403T120000ATTACH;FMTTYPE=audio/basic:http://example.com/pub/audio-files/ssbanner.audREPEAT:4DURATION:PT1HEND:VTODOEND:VCALENDAR旅行事項.VJOURNAL是一個旅行事項。它們將一段描述文字關聯一個詳細的日曆日期上，這可以被使用者記錄活動和成長日誌，或者描述待辦事項的進展。VJOURNAL日曆元件不會影響日曆上的時間狀況，所以不會對空閒和繁忙狀態有任何影響。在實踐上，有很少的程式支援VJOURNAL項，不過也有存在一些實現。比如：Plum Canary's Chirp軟體將VJOURNAL和VTODO一起使用。KDE中的KOrganizer也支援VJOURNAL。下面就是旅行事項的例子BEGIN:VCALENDARVERSION:2.0PRODID:-//ABC Corporation//NONSGML My Product//ENBEGIN:VJOURNALDTSTAMP:19970324T120000ZUID:uid5@host1.comORGANIZER:MAILTO:jsmith@example.comSTATUS:DRAFTCLASS:PUBLICCATEGORIES:Project Report, XYZ, Weekly MeetingDESCRIPTION:Project xyz Review Meeting Minutes\nAgenda\n1. Review of project version 1.0 requirements.\n2.Definitionof project processes.\n3. Review of project schedule.\nParticipants: John Smith, Jane Doe, Jim Dandy\n-It wasdecided that the requirements need to be signed off byproduct marketing.\n-Project processes were accepted.\n-Project schedule needs to account for scheduled holidaysand employee vacation time. Check with HR for specificdates.\n-New schedule will be distributed by Friday.\n-Next weeks meeting is cancelled. No meeting until 3/23.END:VJOURNALEND:VCALENDAR注意: 這個例子中來自於RFC 2445 。在這裡將原文中的CATEGORY修正為CATEGORIES，這是原文中的一個錯誤。空閒/繁忙時間.VFREEBUSY被用在 空閒/繁忙時間 設定請求，這種請求的回應，以及繁忙時間的釋出中。下面就是一個系統時間釋出的例子。BEGIN:VCALENDARVERSION:2.0PRODID:-//RDU Software//NONSGML HandCal//ENBEGIN:VFREEBUSYORGANIZER:MAILTO:jsmith@example.comDTSTART:19980313T141711ZDTEND:19980410T141711ZFREEBUSY:19980314T233000Z/19980315T003000ZFREEBUSY:19980316T153000Z/19980316T163000ZFREEBUSY:19980318T030000Z/19980318T040000ZURL:http://www.example.com/calendar/busytime/jsmith.ifbEND:VFREEBUSYEND:VCALENDAR其它元件型別.其它元件型別還有VTIMEZONE。釋出更新.當計劃事件更改，UID欄位將釋出更新。首先事件建立時會生成一個全域性唯一識別符號作為UID。之後當有一個事件跟隨這個UID釋出，則認為這是早先事件的修改版本，並替換掉它。日曆擴充套件.iCalendar支援私有擴充套件，即在屬性名前冠以"X-"字首。比如：