You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何将含Date?的结构体保存为Date格式而非时间戳

解决结构体中Date类型保存为时间戳的问题

你当前的代码流程是将结构体编码为JSON Data后,再转成JSON对象存入UserDefaults,这会导致两个问题:一是JSONEncoder默认用时间戳格式编码Date,二是最终存储的是字典而非原结构体,所以取出后日期会变成时间戳。

正确解决方案

直接存储结构体编码后的原始Data,读取时再解码回结构体,即可保留Date类型和完整结构体:

保存代码

do {
    let data = try JSONEncoder().encode(contact)
    UserDefaults.standard.set(data, forKey: "contact")
} catch {
    print("编码失败:\(error)")
}

读取代码

if let data = UserDefaults.standard.data(forKey: "contact") {
    do {
        let savedContact = try JSONDecoder().decode(Contact.self, from: data)
        print(savedContact) // Date属性保持原类型
    } catch {
        print("解码失败:\(error)")
    }
}

自定义日期格式(可选)

如果需要将日期以字符串格式(如ISO8601)存储而非默认的时间戳,可以给编码器和解码器设置日期策略:

// 保存时设置编码器
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .iso8601
do {
    let data = try encoder.encode(contact)
    UserDefaults.standard.set(data, forKey: "contact")
} catch {
    print("编码失败:\(error)")
}

// 读取时设置解码器
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
if let data = UserDefaults.standard.data(forKey: "contact") {
    do {
        let savedContact = try decoder.decode(Contact.self, from: data)
        print(savedContact)
    } catch {
        print("解码失败:\(error)")
    }
}

内容的提问来源于stack exchange,提问作者Vladislav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 19:40:34