DateFormatter在iOS 11与iOS 10中日期显示不一致问题求助
iOS 10.3.1模拟器日期比iOS 11+设备晚1小时?看这里解决
问题背景
我碰到过类似的时区坑,刚好和你描述的情况完全一致:在挪威时区环境下,iOS 10.3.1模拟器显示的时间比iOS 11.2的真机/模拟器整整晚了1小时,具体测试结果如下:
- iPhone 6 Plus(iOS 11.2真机):
4 Jan 2018 14:32 - iPhone 5S(iOS 11.2模拟器):
4 Jan 2018 14:32 - iPhone 5S(iOS 10.3.1模拟器):
4 Jan 2018 13:32
你的期望是所有设备都统一显示4 Jan 2018 14:32,复现代码很直接:
let dateFormatter = DateFormatter() dateFormatter.dateFormat = "d MMM yyyy HH:mm" label.text = dateFormatter.string(from: Date())
问题根源
这其实是iOS系统时区数据库版本差异导致的。挪威在2017年调整了夏令时相关的时区规则,iOS 11.2的系统已经同步了最新的时区数据库,包含了这次调整;但iOS 10.3.1的时区数据库还是旧版本,所以在计算当前时间的时区偏移时出现了1小时的误差。
解决办法
最稳妥的方式就是显式指定时区,不让DateFormatter依赖系统默认的时区配置。针对挪威时区,直接设置Europe/Oslo标识符即可:
let dateFormatter = DateFormatter() dateFormatter.dateFormat = "d MMM yyyy HH:mm" // 强制指定挪威时区,规避系统版本差异带来的问题 dateFormatter.timeZone = TimeZone(identifier: "Europe/Oslo") label.text = dateFormatter.string(from: Date())
修改后,不管是iOS 10还是iOS 11+的设备,都会按照统一的时区规则格式化日期,再也不会出现时间偏差了。
另外提个小建议:做国际化日期显示时,尽量显式指定时区或者让用户自行选择,依赖系统默认时区很容易因为不同系统版本的时区数据库更新不及时踩这类坑。
内容的提问来源于stack exchange,提问作者eirikvaa
相关产品推荐
相关产品推荐

