我的问题是我将日期保存到字符串中并将其保存为CoreData中的日期。之后,我需要从字符串中提取日期,比较两者,并发现它们的日期相同。现在,这种平等检查失败了。这两个日期相隔7小时,但会议记录正确。我认为这是一个时区问题,但我无法弄清楚如何解决它。
日期的起源
我有一个日期选择器的日期,我保存到CoreData,如下所示:
task.setValue(dueDatePicker.date, forKey: "dueDate")
之后我格式化日期并将该日期插入到消息中:
let dateFormatter = DateFormatter()
let dateFormat = DateFormatter.Style.medium
let timeFormat = DateFormatter.Style.short
dateFormatter.dateStyle = dateFormat
dateFormatter.timeStyle = timeFormat
let formattedDate = dateFormatter.string(from: date)
let message = ("Upcoming task on \(formattedDate)")
该消息成为通知的一部分。几小时或几天后(当通知触发并且用户选择操作时)我得到CoreData日期:
fetchRequest.predicate = NSPredicate(format: "dueDate = %@", dateOfTask)
然后我分解通知消息并获取日期:
let start = notifString.range(of: "on ")
let rawDate = notifString[(start.upperBound)!..<(notifString.endIndex)]
let dateFormatter = DateFormatter()
dateFormatter.timeZone =
dateFormatter.dateFormat = "MMM-d-yyyy, H:mm a"
let dateFromString = dateFormatter.date(from: rawDate)
最后,我比较一下。目前时间显然是相同的日期和时间,但时区相差约7小时。但是,我不想强制匹配的时区(例如强制UTC),因为这可能对其他位置的用户不起作用。
如何在不出现此明显时区问题的情况下检索这两个日期?
答案 0 :(得分:0)
非常明显,使用userInfo作为@ Paulw11建议:
newLocalNotif.fireDate = dueDateWarningTime
newLocalNotif.alertBody = message
newLocalNotif.timeZone = TimeZone.autoupdatingCurrent
newLocalNotif.soundName = UILocalNotificationDefaultSoundName
newLocalNotif.category = "DueDates"
newLocalNotif.userInfo = ["name": name, "desc": desc, "dueDate" : date]