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

将JSON日期格式转换为Swift Date对象失败问题咨询

问题分析与解决方案

嘿,你的代码崩溃主要有两个核心问题,我给你拆解清楚:

1. 日期格式字符串不匹配

你的输入日期字符串是 2018-01-10T11:57:21.153,里面包含三位毫秒数(.153),但你设置的dateFormat是"yyyy-MM-dd'T'HH:mm:ssZ"——这个格式只覆盖到秒,完全没处理毫秒部分,导致dateFormatter.date(from:)返回nil,后面的强制解包!直接触发崩溃。

另外,你的输入字符串里没有时区标识(比如Z或者+0800),但格式里写了Z,这也会导致解析失败。如果你的日期是UTC时区,需要明确指定时区,或者调整格式去掉Z(更推荐指定时区避免歧义)。

2. 强制解包的风险

即使格式正确,用!强制解包Date?类型也非常危险——只要解析失败(比如服务器返回的日期格式临时变更),就会直接崩溃。一定要用安全的可选绑定来处理。

修正后的代码

let dateSentString = jsonDict["date"] as! String // 这里如果jsonDict["date"]可能为nil,也建议用if let/guard let处理
let dateFormatter = DateFormatter()
// 加上.SSS匹配毫秒,同时指定UTC时区(根据实际业务调整时区)
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"
dateFormatter.timeZone = TimeZone(identifier: "UTC")
// 用guard let安全解包,避免崩溃
guard let date = dateFormatter.date(from: dateSentString) else {
    print("日期解析失败,请检查格式是否匹配")
    return
}
// 这里可以正常使用解析后的date对象
print(date)

如果你的日期字符串实际带有时区标识(比如原字符串是2018-01-10T11:57:21.153Z),那格式应该改成"yyyy-MM-dd'T'HH:mm:ss.SSSZ",这样就能正确解析时区信息了。

内容的提问来源于stack exchange,提问作者FS.O6

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:51:19