【问题标题】:Error in DataPicker FormatDatePicker 格式错误
【发布时间】:2017-09-19 15:55:17
【问题描述】:
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm "

let selectedDate = dateFormatter.string(from: sender.date)

UserDefaults.standard.set(selectedDate, forKey: "date")
print(selectedDate)

\\method to reload the selected time inside the viewdidLoad func

let selectedDate = UserDefaults.standard.object(forKey: "date")
example.setDate(selectedDate as! Date ?? Date(), animated: false)

但当我运行应用程序时,它会返回此错误

无法将“__NSCFString”(0x108e8b4f0) 类型的值转换为“NSDate”(0x108e8c0d0)。

我转换为 HH:mm 因为我只想以这种格式记录时间,但我不知道我将如何处理它

【问题讨论】:

  • 您将日期作为String 存储在UserDefaults 中,因此您将其返回为type '__NSCFString' 而不是'NSDate' 并且您不能将其转换为Date。目前还不清楚你要完成什么。

标签: swift nsuserdefaults datapicker


【解决方案1】:

您应该将 Date 对象本身存储在 UserDefaults 中,而不是其字符串表示形式。在大多数用例中,存储Date 对象更有意义,因为Date 对象代表一个绝对时间点,因此您可以使用它们进行日期比较或将它们转换为当地时间。

此外,看起来setDate 函数实际上需要Date 对象而不是字符串,因此生成日期的字符串表示然后将其存储在UserDefaults 中是没有意义的。

//Save the Date object
UserDefaults.standard.set(sender.date, forKey: "date")

//Retrieve the Date object, if it cannot be retrieved, use the current Date
if let selectedDate = UserDefaults.standard.object(forKey: "date") as? Date {
    example.setDate(selectedDate, animated: false)
} else {
    example.setDate(Date(), animated: false)
}

【讨论】:

    【解决方案2】:

    你将字符串值保存在UserDefaults 中并尝试从字符串中设置NSDate。如果您只关心时间,那么我的建议是将日期保存在UserDefaults 中,并根据您的要求获取time 格式。

    以下是保存和检索时间的步骤:

    为了节省:

       func datePickerChanged(_ sender: UIDatePicker){
    
        UserDefaults.standard.set(sender.date, forKey: "date")
    
    }
    

    用于检索:

     func getTime(){
    
        let date = UserDefaults.standard.object(forKey: "date") as! Date
    
        let dateFormatter = DateFormatter()
        dateFormatter.locale = NSLocale.current
        dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone! //Set your own time zone here.
    
        dateFormatter.dateFormat = "HH:mm"
    
        print(dateFormatter.string(from: date as Date))
    
        example.setDate(date, animated: false)
    
    }
    

    希望它能帮助您并节省您的时间。

    【讨论】:

    • 为什么要麻烦所有的日期 字符串转换?只需存储实际的 Date 并避免所有转换。
    • @rmaddy 是的,虽然转换时间很长,但我已经更新了我的答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多