英国区域设置下JSON日期字符串使用DateFormatter解析失败问题
解析失败根本原因
DateFormatter默认会继承设备当前的区域配置,当设备设置为英国区域+12小时制时,系统会自动修改你声明的dateFormat规则:将24小时制的HH替换为12小时制的h,同时新增AM/PM标记的匹配逻辑,和你拿到的固定24小时制JSON时间字符串格式不匹配,最终解析失败。
修复方案
给DateFormatter显式指定en_US_POSIX类型的Locale即可,该Locale是苹果专门设计用于处理机器生成的固定格式时间字符串的,完全不受用户系统区域、时间制式设置的影响。
- Swift配置示例:
let dateFormatter = DateFormatter() // 必须在设置dateFormat之前配置locale dateFormatter.locale = Locale(identifier: "en_US_POSIX") dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS" // 如果JSON时间为UTC时间,可额外配置时区避免偏移 dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
- Objective-C配置示例:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS"; // 按需配置时区 dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
注意事项
- 仅在处理后端返回、JSON携带这类固定格式的机器生成时间时使用
en_US_POSIX,如果是需要将日期转为给本地用户查看的展示字符串,不要设置该Locale,否则会不符合用户的系统显示习惯。 - 注意配置顺序:先设置
locale再设置dateFormat,避免部分旧系统版本下规则不生效的问题。
内容的提问来源于stack exchange,提问作者Nate Mann
相关产品推荐
相关产品推荐

