2017-10-11 138 views
0

我正在研究用C++編寫的iCal解析器。在這種情況下,我注意到幾個事件,都是由Thunderbird生成的,我的解析器無法正確解析。iCal - 由Thunderbird生成的奇怪事件

下面是這些事件的一個樣本:

BEGIN:VEVENT 
CREATED:20170111T221139Z 
LAST-MODIFIED:20170111T221145Z 
DTSTAMP:20170111T221145Z 
UID:882f4c15-03e9-451c-bf4f-b3422ed8ef54 
RDATE;VALUE=DATE-TIME:20170111T163000Z 
DTSTART;TZID=Europe/Berlin:20170111T173000 
DTEND;TZID=Europe/Berlin:20170111T173000 
X-MOZ-FAKED-MASTER:1 
X-MOZ-GENERATION:1 
END:VEVENT 
BEGIN:VEVENT 
CREATED:20170106T215137Z 
LAST-MODIFIED:20170111T221145Z 
DTSTAMP:20170111T221145Z 
UID:882f4c15-03e9-451c-bf4f-b3422ed8ef54 
SUMMARY:Obst 
RECURRENCE-ID;TZID=Europe/Berlin:20170111T173000 
DTSTART;TZID=Europe/Berlin:20170111T194500 
DTEND;TZID=Europe/Berlin:20170111T201500 
SEQUENCE:7 
TRANSP:OPAQUE 
X-MOZ-GENERATION:12 
END:VEVENT 

我注意到此事件上幾個特殊功能:

  • 主要事件不包含摘要,只有鏈接的異常包含一個。
  • 開始日期和結束日期相等。
  • 主事件不包含任何重複規則(RRULE),但它包含重複日期(RDATE)。
  • 主要事件中的重現日期位於事件開始日期和時間前30分鐘。

我試圖在Google日曆和Outlook中導入它。在Google日曆中,該事件顯示在正確的日期和時間,鬧鐘設置爲事件發生前30分鐘。使用Outlook(2013)我只能部分導入事件,並顯示以下屏幕截圖中顯示的錯誤消息。我想只有第二個VEVENT被導入,因爲第一個是不包含標題的。

The event imported in Outlook

這個事件是如何建立我想不通。爲此,我有幾個問題:

  • 此事件是否正確生成,或者它可能是Thunderbird日曆中的錯誤?
  • RDATE模式可能不存在RRULE?這是有道理的嗎?
  • 應該將RDATE模式中的日期視爲警報而不是最終重現的發生?
  • 在這種情況下,主事件和他的例外之間的關係是什麼,因爲主事件不包含RDATE模式之外的任何重複規則,這似乎不是一個真正的重複規則?
  • 什麼可能意味着未記錄的X-MOZ-FAKED-MASTER屬性?這與這個奇怪事件的建立方式有關嗎?
+0

這是一個寫得很好的問題。 –

回答

1

從標準的角度來看,只需使用RDATE(s)而不使用RRULE即可完美地表示重現事件。 Lotus Notes等一些傳統客戶端總是將重現規則轉換爲一系列RDATE。看看你應該如何進行計算https://tools.ietf.org/html/rfc5545#section-3.8.5.2 實際上,最近的客戶並沒有很好地處理包含RDATE的循環事件。他們可能會正確顯示它們,但無法提供編輯它們的方法。

從您的屏幕截圖看來,這是Outlook抱怨的事情(不支持的重現模式)。

至於這個特殊的事件,它看起來確實很時髦,因爲這基本上是一個只有一個實例的循環事件。更令人感到奇怪的是,這個單一實例附加了一個例外,它會覆蓋SUMMARY/DTSTART/DTEND。但是這並不是無效的。

(請注意,VEVENT中不包含概要)。

現在這種情況下是無效的,但由於其他原因: 1)RDATE應該使用相同的格式DTSTART/DTEND,即本地時間與時區 2)正如你提到的,DTSTART和DTEND不能相同按照https://tools.ietf.org/html/rfc5545#section-3.8.2.2

+0

Thx爲這個答案,允許我決定一個好的策略來正確地管理這類事件。 –