【问题标题】:How Occurrence date of an event is different from the start date?事件的发生日期与开始日期有何不同?
【发布时间】:2012-12-28 10:10:52
【问题描述】:

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

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

【问题讨论】:

    标签: cocoa calendar eventkit ekevent


    【解决方案1】:

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

    分离前

    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 的时间间隔。

    【讨论】:

    • 哇。你是分享你的发现的圣人。我度过了多么令人困惑的一天。
    【解决方案2】:

    来自the EKEvent.occurrenceDate documentation

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

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

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

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

    【讨论】:

    • 感谢您的回答。但是如果你分离一个事件,它可能会有另一个标识符,所以发生日期无论如何都不会有用。并且文档确实没有描述该问题。
    • @Kentzo:是的,分离事件是一个单独的事件。根据文档,它继承了原始重复事件的occurenceDate,但带有一个新的startDate,无论它是分离到哪个日期。
    • 但是发生日期是没用的,因为你需要旧的UIDoccurrenceDate 来获取原始事件。我想知道你为什么需要这个,在什么情况下你可以使用它。
    • 我发现,当您“分离”重复事件(例如,通过修改开始日期)时,UID 被保留。因此occurrence(和occurrenceDate)可以通过eventWithUID:occurrence:来获取CalEvent(和EKEvent)对象
    【解决方案3】:

    根据 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
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2017-12-21
      • 2017-01-05
      相关资源
      最近更新 更多