iOS 15.4中Sept缩写导致日期转换崩溃问题求助
解决方案:iOS 15.4 9月日期解析崩溃问题
核心问题原因
iOS 15.4 对 en_GB 区域设置下的9月缩写做了调整,从原有的3字符缩写 Sep 改为4字符的 Sept。你的解析代码使用固定格式 dd MMM yyyy(期望3字符月份缩写),无法匹配 Sept,导致 date(from:) 返回 nil,后续强制解包触发崩溃。
方案一:避免字符串中转(推荐)
最可靠的方式是直接保存 DatePicker 选中的 Date 对象,跳过「Date→字符串→Date」的转换流程,彻底规避系统版本对字符串格式的影响:
// 定义变量存储选中的日期 var selectedDate: Date? @objc func doneDateClicked() { guard let pickerDate = datePicker?.date else { return } selectedDate = pickerDate // 仅负责生成显示用的字符串,不依赖该字符串反向解析 let dateFormatter = DateFormatter() dateFormatter.dateStyle = .medium dateFormatter.timeStyle = .none dateFormatter.timeZone = TimeZone(identifier: "GMT") dateFormatter.locale = Locale(identifier: "en_GB") dateFormatter.dateFormat = "dd MMM yyyy" dateTextField.text = dateFormatter.string(from: pickerDate) self.view.endEditing(true) } // 后续需要使用日期时直接调用selectedDate if let targetDate = selectedDate { // 处理日期逻辑 }
方案二:兼容两种月份缩写的解析
如果必须从文本框的字符串解析日期,可通过多格式尝试的方式兼容 Sep 和 Sept:
func parseDate(from dateString: String) -> Date? { let formatter = DateFormatter() formatter.locale = Locale(identifier: "en_GB") formatter.calendar = Calendar(identifier: .gregorian) formatter.timeZone = TimeZone(identifier: "GMT") // 尝试两种可能的月份格式 let possibleFormats = [ "dd MMM yyyy hh:mm:ss", // 匹配Sep格式 "dd Sept yyyy hh:mm:ss" // 匹配Sept格式 ] for format in possibleFormats { formatter.dateFormat = format if let parsedDate = formatter.date(from: "\(dateString) 00:00:00") { return parsedDate } } return nil } // 使用示例 if let text = dateTextField.text, let datenN = parseDate(from: text) { // 处理解析后的日期 } else { // 解析失败的容错处理(避免崩溃) }
额外优化建议
- 移除代码中冗余的配置:比如重复设置
timeZone(secondsFromGMT:0和GMT是等价的,保留一行即可); - 永远不要强制解包可选值(如
datePicker?.date!),改用可选绑定(guard let/if let)避免意外崩溃; - 清理未使用的变量:当前代码中
timeFormatter未被调用,可删除。
内容的提问来源于stack exchange,提问作者Vladislav Yarmak
相关产品推荐
相关产品推荐

