如何在Swift中正确解析ISO 8601日期字符串并转换为指定短日期格式
问题根因
你当前解析失败的核心原因是没有给DateFormatter指定与输入字符串完全匹配的解析格式,系统默认的.short日期样式仅能识别系统区域对应的短日期(比如国内的2021/9/3这类格式),完全匹配不上你输入的带微秒、时区的ISO 8601格式日期串。
修正后完整代码
func dateFormaterString(inputDate: String) -> String { let formatter = DateFormatter() // 固定格式解析必须加这个locale,避免系统区域设置导致解析失败 formatter.locale = Locale(identifier: "en_US_POSIX") // 第一步:设置和输入串完全匹配的解析格式 // yyyy=4位年, MM=2位月, dd=2位日, 'T'是固定字符, HH=24小时制时, mm=分, ss=秒, SSSSSS=6位微秒, ZZZZZ=+05:30格式的时区 formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZZZZZ" // 先把输入串转成Date对象 guard let date = formatter.date(from: inputDate) else { return "" // 解析失败返回空,你也可以自定义默认值 } // 第二步:设置期望的输出格式 // 如果你要的是 月/日/年 格式就用 MM/dd/yyyy,要 日/月/年 就用 dd/MM/yyyy formatter.dateFormat = "MM/dd/yyyy" // 如果你需要输出为指定时区的日期,就加这行,比如北京时间就是 "Asia/Shanghai" // formatter.timeZone = TimeZone(identifier: "Asia/Shanghai") return formatter.string(from: date) } // 调用测试 let result = dateFormaterString(inputDate: "2021-09-03T19:33:44.791822+05:30") print(result) // 默认输出为输入时区的日期:09/03/2021,修改输出时区后会对应调整
注意事项
- 如果你期望的
09/07/2021是转换到你当地时区后的日期,自行修改上述代码的timeZone属性为你所在时区的标识符即可。 - 解析用的dateFormat必须和输入串完全对应,多一个少一个字符都会解析失败,比如输入串有6位微秒,就必须写6个S,不能只写3个。
内容的提问来源于stack exchange,提问作者kiran
相关产品推荐
相关产品推荐

