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
相关产品推荐
相关产品推荐

