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
相关产品推荐
相关产品推荐

