1

CalEvent 和 EKEvent 都表示 startDate、endDate 和occurrenceDate。但是由于事件对象代表具体的事件,具有具体的开始和结束日期。有一个总是与 startDate 相同的发生日期的原因是什么?

是否存在发生事件的开始日期与事件的开始日期不匹配的情况?

4

3 回答 3

8

嗯,我刚刚做了一个实验。这是我分离前后的经常性事件。

分离前

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 UTC 到occurrenceDate.

于 2016-02-13T00:44:21.503 回答
1

来自EKEvent。occurrenceDate文档

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

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

这似乎是倒退的,但这是我从文档中的那段话中得到的。您可以通过在 Calendar/iCal 中创建一个新的重复事件然后分离它的后续事件,并查看分离的事件startDateoccurrenceDate使用 Event Kit 来通过实验验证这一点。

我不知道这在日历商店中是否同样正确或相同,其文档没有描述occurrencestartDate属性之间的区别。

于 2012-12-28T22:41:04.827 回答
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
    }

}
于 2017-10-14T19:20:48.787 回答