iOS系统关闭24小时制时NSDateFormatter.dateFromString返回nil如何解决
iOS固定格式字符串转日期受系统24小时制设置影响问题解决方案
问题根因
DateFormatter(Swift)/NSDateFormatter(Objective-C)默认会继承设备当前的区域配置,当用户关闭系统24小时制选项时,系统会自动给日期解析逻辑新增AM/PM标记匹配规则,与你定义的24小时制格式HH产生冲突,最终导致dateFromString/date(from:)方法返回nil。
解决方案
显式给日期格式化器指定en_US_POSIX区域即可,该区域是苹果官方专门推荐用于处理固定格式日期字符串的配置,完全不受系统时间格式、区域设置的影响。
修正后Objective-C代码
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; // 指定固定locale屏蔽系统设置影响 dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; [dateFormatter setDateFormat:@"yyyy-MM-dd_HH-mm-ss"]; return [dateFormatter dateFromString:dateString];
修正后Swift代码
let formatter = DateFormatter() // 指定固定locale屏蔽系统设置影响 formatter.locale = Locale(identifier: "en_US_POSIX") formatter.dateFormat = "yyyy-MM-dd_HH-mm-ss" let resultDate = formatter.date(from: dateString)
注意事项
上述配置仅适用于解析/生成技术场景的固定格式日期(比如接口返回值、本地缓存的时间标识),如果需要生成给用户查看的日期文本,请不要指定该locale,保持默认的用户区域配置即可,避免日期格式不符合用户所在地的使用习惯。
内容的提问来源于stack exchange,提问作者Mahmoud Adam
相关产品推荐
相关产品推荐

