Swift中字符串转Date返回nil,求排查问题原因
问题分析与解决
嘿,这个问题我太熟了——你设置的日期格式字符串和实际拿到的日期字符串完全不匹配,这就是date返回nil的根本原因!
你手里的日期字符串是May 31, 2018 at 3:35 PM,但你给dateFormatter用的格式是yyyy-MM-dd HH:mm:ss,这个格式对应的是2018-05-31 15:35:00这种结构的字符串,两者完全搭不上,自然解析失败返回nil啦。
解决步骤
第一步:匹配正确的日期格式
针对May 31, 2018 at 3:35 PM这种格式,对应的dateFormat应该写成MMM dd, yyyy 'at' h:mm a,每个部分对应含义:MMM:缩写的月份名称(比如May)dd:两位数字的日期(31)yyyy:四位数字的年份(2018)'at':固定的"at"字符串,用单引号包起来表示这是字面量,不用解析h:mm:12小时制的小时+分钟(3:35)a:上午/下午标记(PM)
第二步:显式设置Locale(推荐操作)
为了避免系统区域设置搞乱解析结果,尤其是你的App可能在非英文环境运行时,建议给dateFormatter加上en_US_POSIX的locale,这样不管系统语言是什么,解析英文格式的日期都不会出错。
修改后的完整代码
if let order_date = value["order_date"] as? String { let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "en_US_POSIX") // 固定locale,避免解析异常 dateFormatter.dateFormat = "MMM dd, yyyy 'at' h:mm a" if let date = dateFormatter.date(from: order_date) { // 解析成功啦,这里处理你的date对象就行 print(date) } else { // 可以加个解析失败的提示,方便调试 print("日期解析失败啦,检查下字符串格式是否正确") } }
小提示
要是你的日期字符串里月份缩写有大小写变化(比如may而非May),或者日期是单数字(比如5而非05),MMM和dd格式符都能自动适配,不用额外调整哦~
内容的提问来源于stack exchange,提问作者user9832488
相关产品推荐
相关产品推荐

