2016-12-31 37 views
0

我的问题是我将一个日期保存到字符串中,并作为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

我没有看到类似的代码,如 “dateFormatter.locale =区域设置(标识符: ”EN“)”。所以你没有给出时区。 –

+0

我不完全明白。这些本地通知或推送通知是?如果他们是推送通知,那么你如何生成一个对用户有意义的日期字符串,因为他们可能在不同的时区?如果它们是本地通知,那么您是否可以保证通知中的日期字符串位于用户当前的时区,并相应地设置日期格式化程序中的时区? –

+1

如果数据来自UILocalNotificstion,那么您应该将相关数据存储在'userInfo'字典中,而不是试图解析字符串 – Paulw11

回答

0

公然明显,使用作为用户信息@ 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]