事件的发生日期与开始日期有何不同?

时间:2012-12-28 10:10:53

标签: cocoa calendar

CalEvent和EKEvent都代表startDate,endDate和occurrenceDate。但由于事件对象代表具体事件,具有具体的开始和结束日期。是什么原因使occurrence出现始终与startDate相同?

当eventsDate与事件的startDate不匹配时会出现这种情况吗?

3 个答案:

答案 0 :(得分:6)

好吧,我刚做了一个实验。 这是我在分离之前和之后的经常性事件。

在分离之前

po calendarItemExternalIdentifier
"68100758-1572-4662-87C8-84F32680D7C2"
po calendarItemIdentifier
"0D3D5906-9C0F-435A-A0BA-7A6B64086E86"
po self.occurrenceDate
2016-02-12 04:00:00 +0000
po startDate
2016-02-12 04:00:00 +0000
po self.isDetached
false

po calendarItemExternalIdentifier
"68100758-1572-4662-87C8-84F32680D7C2/RID=476942400"
po calendarItemIdentifier
"DAD9A39D-BD57-40D6-8615-B57E3AF9387C"
po self.occurrenceDate
2016-02-12 04:05:00 +0000
po startDate
2016-02-12 04:05:00 +0000
po self.isDetached
true

occurrenceDate确实发生了变化,与其声称的相反。还有一些有趣的事情(并且未记录(?))calendarItemExternalIdentifier也因为附加了RID而被更改。 RID似乎是从2001年1月1日00:00:00到occurrenceDate的时间间隔。

答案 1 :(得分:1)

来自the EKEvent.occurrenceDate documentation

  

即使事件已分离且其开始日期已更改,此值仍将保持不变。

因此,如果您有一个定期事件,并且从该事件中分离出该事件,则创建一个新的单独事件,新事件将具有相同的occurrenceDate但不同的startDate

这似乎是倒退,但它是我从文档中的那段经文得到的。您可以通过实验验证这一点,方法是在Calendar / iCal中创建一个新的周期性事件,然后分离后续出现的事件,并使用事件工具包查看已分离的事件startDateoccurrenceDate

我不知道这在日历商店中是否同样如此,whose documentation并未描述occurrencestartDate之间的差异属性。

答案 2 :(得分:0)

根据Kostia Kim的回答,这是获取原始出现日期的延伸:

extension EKEvent {

    var originalOccurrenceDate: Date? {
        guard self.isDetached, let interval = timeIntervalFromExternalIdentifier else { return nil }
        return Date(timeIntervalSinceReferenceDate: interval)
    }

    var timeIntervalFromExternalIdentifier: TimeInterval? {
        let intervalKey = "/RID="
        guard let externalId = calendarItemExternalIdentifier, externalId.contains(intervalKey) else { return nil }

        let identifierSegments = externalId.components(separatedBy: intervalKey)
        guard let lastSegment = identifierSegments.last, let ridInterval = TimeInterval(lastSegment) else { return nil }

        return ridInterval
    }

}