Swift String转Date结果异常 自定义扩展转换输出不符合预期如何解决
问题根因
- 日期格式符误用大写
Y:Y是ISO 8601标准的周年纪年,取值对应日期所在周归属的年份,和公历年不一致;公历年需要使用小写y,这是转换结果偏差的核心原因。 - 缺少固定locale配置:
MMMM(月份全称)、E(星期简称)的解析依赖系统语言环境,未指定英文locale时,非英语系统会直接解析失败。
修复后代码
extension Date { func toString() -> String { let dateFormatter = DateFormatter() // 固定英文locale,保证月份、星期的格式匹配输入 dateFormatter.locale = Locale(identifier: "en_US_POSIX") // 将大写Y替换为小写y,使用公历年 dateFormatter.dateFormat = "MMMM dd, y (E)" dateFormatter.timeZone = TimeZone(identifier: "UTC") return dateFormatter.string(from: self) } } extension String { func toDate() -> Date? { let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "en_US_POSIX") dateFormatter.dateFormat = "MMMM dd, y (E)" dateFormatter.timeZone = TimeZone(identifier: "UTC") // 去掉强制解包,返回可选类型避免非法输入导致的崩溃 return dateFormatter.date(from: self) } }
验证结果
输入测试用例September 09, 2021 (Thu)调用修复后的toDate()方法,得到的UTC日期为2021-09-09 00:00:00 +0000,完全匹配预期。
内容的提问来源于stack exchange,提问作者PJH
相关产品推荐
相关产品推荐

