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

Swift字符串转Date始终返回nil:日期格式转换问题排查

解决DateFormatter转换返回nil的问题

你的问题核心在于日期格式字符串不匹配,再加上缺少关键的Locale配置,导致系统无法正确解析"Apr 25 2018 12:00AM"这个日期字符串。下面是具体的修正方案:

问题拆解

  • 输入日期里的月份是英文缩写(Apr),你用的M只能匹配数字形式的月份(比如4),正确格式应该是MMM来匹配三个字母的月份缩写
  • 如果你的设备系统语言不是英文,默认Locale无法识别英文月份缩写,必须显式指定en_US_POSIX来确保解析不受系统语言干扰
  • 虽然h:mm A能匹配12小时制的时间,但在en_US_POSIX标准下,用小写a适配AM/PM会更稳妥

修正后的完整代码

// 先安全获取日期字符串,避免强制解包崩溃
guard let dateString = tableDic["SLAIssuedFinalGradingDate"] as? String else {
    print("无法从字典中获取日期字符串")
    return
}

let formatter = DateFormatter()
// 关键配置:固定Locale,避免系统语言影响解析
formatter.locale = Locale(identifier: "en_US_POSIX")
// 匹配输入日期的格式:月份缩写+日期+年份+12小时制时间
formatter.dateFormat = "MMM dd yyyy h:mm a"

if let SLAIssuedFinalGradingDate = formatter.date(from: dateString) {
    // 切换为目标输出格式
    formatter.dateFormat = "yyyy-MM-dd"
    let SLAIssuedFinalGradingDateString = formatter.string(from: SLAIssuedFinalGradingDate)
    print("转换后的日期:\(SLAIssuedFinalGradingDateString)")
} else {
    print("日期解析失败,请检查输入格式是否匹配")
}

重要提示

  • 永远不要用as!或者强制解包date(from:)的结果,用if let/guard let处理可能的nil情况,避免程序崩溃
  • en_US_POSIX是专门用于机器可读日期解析的固定Locale,不会随用户系统设置变化,非常适合处理这种固定格式的英文日期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:26:14