如何让DateFormatter适配iOS日期与时间设置中的12/24小时切换?
iOS DateFormatter 与系统24小时制设置的冲突解析
刚好碰到过这个问题,来给你理清楚iOS里DateFormatter和系统24小时制开关之间的关系:
情况1:使用"h:mm a"格式(默认12小时制地区)
当你的设备地区是默认12小时制(比如美国),并且DateFormatter配置成这样:
var dateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "h:mm a" return formatter }()
这时候如果用户在iOS设置的「日期与时间」里打开了「24小时时间」开关,DateFormatter会自动输出24小时格式的时间,而不是你指定的h:mm a。原因是DateFormatter默认会尊重用户的系统时间偏好设置,即使你写了12小时的格式符,系统也会自动适配成用户选择的24小时显示。
情况2:使用"H:mm"格式(默认12小时制地区)
如果把格式改成强制24小时的"H:mm":
var dateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "H:mm" return formatter }()
这时候不管用户有没有打开「24小时时间」开关,都会输出24小时格式的时间。因为H是代表24小时制的格式符,优先级高于用户的系统偏好设置,系统不会自动替换这个格式。
额外的实用提示
- 如果你想完全固定格式,不受用户系统设置影响,记得给DateFormatter设置一个固定的locale,比如:
formatter.locale = Locale(identifier: "en_US_POSIX")
这样不管用户的地区和24小时开关怎么设置,都会严格按照你指定的格式输出。
- 如果你想完全尊重用户的时间显示偏好,建议不要用自定义的
dateFormat,而是使用系统提供的timeStyle:
formatter.timeStyle = .short
这样系统会根据用户的24小时开关和地区设置,自动选择最合适的时间显示格式。
内容的提问来源于stack exchange,提问作者shim
相关产品推荐
相关产品推荐

