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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:09:03