如何在UserDefaults中存储日期?

31

我想记录她输入文本框的历史记录,打算使用UserDefaults进行注册。但是当我试图使用UserDefaults保存时,“cannot assign value of type 'nsdate'?'to type 'String' ” 错误出现了。我认为它不接受文本框数据,因为它是字符串。那么如何在内存中保留历史记录?

formatteddate和formatteddate2出现错误。日期输出如下:20/04/2019 20:23

let token = try? keychain.getString("chipnumbernew")
        chip1InfoString = token

        var time = NSDate()
        var formatter = DateFormatter()
        formatter.dateFormat = "dd/MM/yyyy HH:mm"
        var formatteddate = formatter.string(from: time as Date)
        var formatteddate2 = formatter.string(from: time as Date)

        timertextNew.text = formatteddate
        timertext2New.text = formatteddate2


        let RetrivedDate = UserDefaults.standard.object(forKey: "timertext") as? NSDate

       formatteddate = RetrivedDate

        let RetrivedDate2 = UserDefaults.standard.object(forKey: "timertext2") as? NSDate
        formatteddate2 = RetrivedDate2
4个回答

78

如果您只想显示日期值,可以将其转换并存储为字符串;否则,在读取日期后,您需要进行转换/格式化。无论哪种方式,都应确保在保存和读取时使用相同的数据类型。

//save as Date
UserDefaults.standard.set(Date(), forKey: key)

//read
let date = UserDefaults.standard.object(forKey: key) as! Date
let df = DateFormatter()
df.dateFormat = "dd/MM/yyyy HH:mm"
print(df.string(from: date))

// save as String
let df = DateFormatter()
df.dateFormat = "dd/MM/yyyy HH:mm"
let str = df.string(from: Date())
UserDefaults.standard.setValue(str, forKey: key)

// read
if let strOut = UserDefaults.standard.string(forKey: key) {
    print(strOut)
}

57
以下代码将一个 Date 对象保存为一个 Double(也称为 TimeInterval)。这避免了任何日期格式化。格式化可能会丢失精度,并且是不必要的,因为该字符串并不是供用户阅读的。
// save
UserDefaults.standard.set(Date().timeIntervalSince1970, forKey: key)

// read
let date = Date(timeIntervalSince1970: UserDefaults.standard.double(forKey: key))

2

您可以始终创建一个用于在用户默认设置中保存和检索日期的扩展。以下是示例代码:

import Foundation

extension UserDefaults {
    func set(date: Date?, forKey key: String){
        self.set(date, forKey: key)
    }
    
    func date(forKey key: String) -> Date? {
        return self.value(forKey: key) as? Date
    }
}

let userDefault = UserDefaults.standard
userDefault.set(date: Date(), forKey: "timertext")
print(userDefault.date(forKey: "timertext") ?? "")

0

你的问题在于你从用户默认存储中检索NSDate,然后尝试将它们分配给一个字符串(formatteddate)。

试试这个方法:

  formatteddate = formatter.string(from: RetrivedDate as Date)

我必须将它放在字符串中,将其保留在内存中也可以。 - stakabekor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接