2016-12-31 80 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]