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

Swift中转换服务器返回的日期字符串为Date类型时返回nil的问题排查

解决Swift中日期字符串转Date返回nil的问题

嘿,我一眼就发现问题所在了!你的日期字符串里的破折号不是普通的短横线——你用的是–(长破折号,Unicode编码U+2013),但DateFormatter的格式字符串里写的是普通的-(短横线,Unicode编码U+002D),这俩字符看起来相似但完全不同,导致Formatter匹配失败,所以才会返回nil!

问题复现验证

你的原代码里的日期字符串:

let dateString = "2017–04–02T13:10:00.000"

仔细看里面的2017–04,这里的分隔符是长破折号,而你的格式yyyy-MM-dd'T'HH:mm:ss.SSS里是普通短横线,两者不匹配,这是核心原因。

修复方案

这里给你两种可行的解决办法:

方案1:替换字符串中的长破折号为普通短横线

如果服务器返回的字符串格式没法改,我们可以先把长破折号替换掉再解析:

let dateString = "2017–04–02T13:10:00.000"
// 将长破折号替换为普通短横线
let correctedDateStr = dateString.replacingOccurrences(of: "–", with: "-")

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"
// 建议设置时区,避免设备时区差异影响解析结果
dateFormatter.timeZone = TimeZone(identifier: "UTC")

if let date = dateFormatter.date(from: correctedDateStr) {
    print("解析成功:\(date)")
} else {
    print("解析失败")
}

方案2:直接在格式字符串中使用长破折号

如果服务器固定返回带长破折号的日期字符串,也可以直接把格式里的短横线换成对应的长破折号:

let dateString = "2017–04–02T13:10:00.000"

let dateFormatter = DateFormatter()
// 注意这里的破折号是和字符串一致的长破折号
dateFormatter.dateFormat = "yyyy–MM–dd'T'HH:mm:ss.SSS"
dateFormatter.timeZone = TimeZone(identifier: "UTC")

if let date = dateFormatter.date(from: dateString) {
    print("解析成功:\(date)")
} else {
    print("解析失败")
}

额外提示

你之前尝试切换到24小时制的HH是正确的选择(因为你的时间是13点,12小时制的hh确实会导致匹配问题),但这次的核心矛盾还是字符不匹配。另外,解析日期时建议设置时区,避免不同设备时区差异导致的解析异常哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:56:42