同一天......但不同?也许时区混乱

时间:2016-12-31 22:06:34

标签: ios swift nsdateformatter

我的问题是我将日期保存到字符串中并将其保存为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),因为这可能对其他位置的用户不起作用。

如何在不出现此明显时区问题的情况下检索这两个日期?

1 个答案:

答案 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]