如果您的 iOS 设备设置为使用默认为 12 小时制的地区(例如美国),并且您的DateFormatter
设置如下:
var dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "h:mm a"
return formatter
}()
然后,如果在 iOS 设置中的日期和时间中打开“24 小时制”开关,它将以 24 小时格式输出时间。
如果您的自定义日期格式是“H:mm”,即 24 小时,并且您仍处于默认 12 小时区域,那么无论 24 小时开关的开/关状态如何,它都会输出 24 小时时间。
好的,很好,很简单,我将只使用“h:mm a”,然后用户将看到根据他们喜欢的格式显示的任何时间。但是,如果您将您的区域更改为默认使用 24 小时时间的区域,则行为会相反!如果您有“H:mm”并且 24 小时时间开关处于关闭状态,它将更改为 12 小时时间(“h:mm a”)。
是的,您通常可以通过使用时间样式(formatter.timeStyle = .short
例如)而不是使用自定义日期格式来避免这种情况,但是如果您需要自定义日期格式并且想要尊重用户的设置,您应该怎么做?(例如,如果您需要在字符串中插入一些自定义字符,或者只是想让组件以非标准顺序排列)
我想在这里吃蛋糕和吃蛋糕的唯一方法是提前检查用户的偏好是什么(据我所知,你不能直接做到这一点)或者语言环境的默认设置是什么(我虽然看不到任何方法)然后相应地调整格式......</p>
我制作了这个 Xcode 项目是为了更清楚地演示这个问题(显然它必须在设备上运行,因为模拟器上没有 24 小时时间开关)。
我知道有各种解决方法,但我不明白如果您正在制作一个使用自定义日期/时间格式的 UI 并且拥有来自世界不同地区的用户的应用程序,Apple 希望您做什么?我错过了什么还是这是iOS中的一个缺陷?
注意:这个问题专门关于将日期转换为字符串以进行显示,所以我想尽可能尊重用户的语言环境和其他设置。我知道您可以将语言环境设置为 en_POSIX 等,但这并不能解决问题。我还希望尽可能无缝地实现这一点,并利用内置的任何功能,但这似乎不可能,除非您只针对具有相同默认 24 小时时间设置的区域中的用户......</p >