You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:42:01