将带有日期的对象保存为用户默认值-日期将不同

时间:2019-06-11 22:17:38

标签: swift nsdate nsuserdefaults codable jsondecoder

我正在保存和恢复一个包含日期的简单结构。使用此字符串格式的原因是RESTful API返回此日期格式。这意味着下面的代码示例不应更改它。

extension DateFormatter {

    static let yyyyMMdd: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd"
        return formatter
    }()

}

struct Person: Codable, Equatable {

    let birthDate: Date

    private enum CodingKeys: String, CodingKey {
        case birthDate
    }

}

func storePerson(_ person: Person) {
    let encoder = JSONEncoder()
    encoder.dateEncodingStrategy = .formatted(DateFormatter.yyyyMMdd)
    guard let encodedPerson = try? encoder.encode(person) else {
        return
    }
    UserDefaults.standard.set(encodedPerson, forKey: "savedPerson")
}

func fetchPerson() -> Person {
    let decoder = JSONDecoder()
    decoder.dateDecodingStrategy = .formatted(DateFormatter.yyyyMMdd)

    guard let savedPerson = UserDefaults.standard.data(forKey: "savedPerson"),
        let person = try? decoder.decode(Person.self, from: savedPerson) else {
            fatalError()
    }

    return person
}

let person = Person(birthDate: Date())
storePerson(person)
let storedPerson = fetchPerson()

print("\(person == storedPerson)") // this will be false
print("\(person.birthDate)")
print("\(storedPerson.birthDate)") // same date as above, but with no minutes

为什么日期不一样?编码器和解码器使用相同的dateEncodingStrategy

0 个答案:

没有答案