Swift Codable自定义JSONDecoder日期解码策略在非24小时制设备为何失效?
解决日期解析在非24小时制下失败的问题
你的解析器在设备切换为12小时制时失效,核心原因是DateFormatter默认采用设备当前Locale,而该Locale会干扰HH(24小时制小时格式)的解析逻辑。只需给DateFormatter设置固定Locale即可解决:
修改后的解码器代码:
internal func getDecoder() -> JSONDecoder { let decoder = JSONDecoder() let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "en_US_POSIX") // 核心修复代码 dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" decoder.dateDecodingStrategy = .formatted(dateFormatter) return decoder }
额外说明
en_US_POSIX是独立于系统设置的特殊Locale,始终采用24小时制解析HH格式,不受设备时间显示偏好影响。- 如果你使用的是iOS 10及以上版本,还可以直接使用系统内置的ISO8601解码策略,代码更简洁且无需手动配置Formatter:
该策略完全兼容你收到的internal func getDecoder() -> JSONDecoder { let decoder = JSONDecoder() decoder.dateDecodingStrategy = .iso8601 return decoder }2022-12-12T16:20:00.000Z格式日期字符串。
内容的提问来源于stack exchange,提问作者rohit phogat
相关产品推荐
相关产品推荐

