无需夏令时调整即可快速创建 EKEvent

Posted

技术标签:

【中文标题】无需夏令时调整即可快速创建 EKEvent【英文标题】:Swift creating EKEvent without daylight saving adjustment 【发布时间】:2018-09-22 09:10:18 【问题描述】:

我在我的应用程序中有一个向日历添加事件的功能,该过程涉及解析日期的字符串表示(使用夏令时调整,并将 EKEvent startDate 设置为它,这是一个 sn-p:

let eventStore : EKEventStore = EKEventStore()
eventStore.requestAccess(to: .event)  (granted, error) in
    if (granted) && (error == nil) 
        let event:EKEvent = EKEvent(eventStore: eventStore)

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "dd-MM-yyyy HH:mm"
        // Just for demonstration
        let myStartingDate = "16-04-2018 14:00:00"

        if let eventDate = dateFormatter.date(from: myStartingDate) 
            event.title = "Test event"

            event.startDate = eventDate

            event.endDate = eventDate.addingTimeInterval(TimeInterval(120 + 20 * 60))
            event.notes = "This is a note"
            event.location = "some location"
            event.calendar = eventStore.defaultCalendarForNewEvents
            do 
                try eventStore.save(event, span: .thisEvent)

                // Success, now open the calendar.
                self.openCalendarOn(date: eventDate)

             catch let error as NSError 
                print("failed to save event with error : \(error)")
            
        
    

一段时间以来,一切都按预期进行,但自从英国夏令时过渡以来,我注意到日历上的事件提前一小时

例如我设置的事件是“16-04-2018 14:00:00”,但日历日期是“16-04-2018 15:00:00”。

有没有办法告诉 EKEvent 禁用夏令时调整?因为我的字符串日期已经有了。

【问题讨论】:

【参考方案1】:

我发现了问题,显然我正在构造时区为 gmt+00:00 的 DateFormatter 对象, 删除时区后,ios 日历上的时间保持不变。

【讨论】:

以上是关于无需夏令时调整即可快速创建 EKEvent的主要内容,如果未能解决你的问题,请参考以下文章

针对当前时区调整的不同夏令时的UTC日期[重复]

将纪元时间转换为人类日期时间字符串,无需夏令时转换

如何在 R 中找到给定日期和时区的夏令时调整?

Delphi NOW 函数的结果如何受“调整时钟以进行夏令时更改”选项的影响

夏令时更改为绝对日期

如何从 Unix 纪元时间转换并在 Python 中考虑夏令时?