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

Swift日期字符串格式转换:将28-OCT-22转为dd.MM.yyyy

问题解决与优化方案

错误原因分析

你的推测没错,大写的OCT确实是导致解析失败的关键。DateFormatter默认会跟随系统的区域设置(Locale),而多数区域的月份缩写并非全大写格式(比如英文区域默认是Oct),所以无法匹配OCT。

修正后的代码

解决这个问题的核心是给DateFormatter指定不受系统区域影响的固定Locale,也就是en_US_POSIX,它能稳定识别全大写的月份缩写。同时要避免强制解包!,改用可选绑定防止崩溃:

let myString = "28-OCT-22"
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "d-MMM-yy"

if let date = dateFormatter.date(from: myString) {
    dateFormatter.dateFormat = "dd.MM.yyyy"
    let stringDate = dateFormatter.string(from: date)
    print(stringDate) // 输出:28.10.2022
} else {
    print("日期解析失败")
}

更简洁的实现方式

可以通过封装成字符串扩展,让代码更简洁且复用性更强:

extension String {
    func convertDate(from originalFormat: String, to targetFormat: String) -> String? {
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = originalFormat
        
        guard let date = formatter.date(from: self) else { return nil }
        formatter.dateFormat = targetFormat
        return formatter.string(from: date)
    }
}

// 使用方式
let myString = "28-OCT-22"
if let convertedDate = myString.convertDate(from: "d-MMM-yy", to: "dd.MM.yyyy") {
    print(convertedDate) // 输出:28.10.2022
}

内容的提问来源于stack exchange,提问作者Alisher Baigazin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:05:23