Swift中DateFormatter将字符串转Date时返回nil的问题
解决DateFormatter转换字符串返回nil的问题
嘿,我一眼就看出问题所在啦!你把DateFormatter的dateFormat设置搞反了,这才导致解析返回nil。让我给你一步步讲清楚怎么解决:
核心错误原因
dateFormatter.dateFormat这个属性的作用是告诉DateFormatter你的输入字符串是什么格式,这样它才能正确把字符串解析成Date对象。而你现在直接把它设成了你想要的输出格式"MMMM, dd, YYYY",这完全不匹配输入字符串"2018-01-18 13:04:42 +0000"的结构,自然解析失败返回nil了。
正确的处理步骤
我们需要分两步走:先把输入字符串解析成Date对象,再把Date对象格式化成你想要的字符串格式。
第一步:解析输入字符串为Date对象
首先要设置和输入字符串完全匹配的dateFormat,输入字符串的结构是年-月-日 时:分:秒 时区偏移,对应的格式符是:
yyyy:4位年份MM:2位月份dd:2位日期HH:24小时制的小时mm:分钟ss:秒Z:时区偏移(比如+0000)
同时建议设置locale为en_US_POSIX,避免系统语言差异导致解析失败。
第二步:将Date对象格式化为目标字符串
得到Date对象后,再把dateFormat改成你想要的输出格式"MMMM, dd, yyyy",然后调用string(from:)方法生成目标字符串。
完整代码示例
let str = "2018-01-18 13:04:42 +0000" let dateFormatter = DateFormatter() // 1. 解析输入字符串为Date对象 dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z" dateFormatter.locale = Locale(identifier: "en_US_POSIX") guard let myDate = dateFormatter.date(from: str) else { print("日期解析失败") return } // 2. 格式化为目标字符串 dateFormatter.dateFormat = "MMMM, dd, yyyy" // 如果需要确保显示英文月份,可以保持locale为en_US_POSIX,或者用系统当前locale dateFormatter.locale = Locale.current let formattedDateString = dateFormatter.string(from: myDate) print(formattedDateString) // 输出:January, 18, 2018
额外注意事项
- 格式完全匹配:输入字符串的每个字符(包括空格、符号)都要和
dateFormat对应,不能有偏差 - YYYY vs yyyy:
YYYY代表周年(基于周的年份),日常场景下用yyyy(日历年)更稳妥 - Locale的重要性:解析固定格式的日期字符串时,用
en_US_POSIX可以避免系统语言影响;如果要输出对应语言的月份名称,再切换到对应locale即可
内容的提问来源于stack exchange,提问作者Maysam
相关产品推荐
相关产品推荐

