我想检查用户是否在 OS X 和 iOS 中选择了 12 小时制或 24 小时制作为他们的偏好。所以我想检测用户是否做了以下操作:
我当前有以下代码,但它始终返回 12 小时制表示的时间,即使用户设置的系统首选项是 24 小时制。
let timeFormatter = NSDateFormatter()
timeFormatter.locale = NSLocale.currentLocale()
timeFormatter.dateStyle = NSDateFormatterStyle.NoStyle
timeFormatter.timeStyle = NSDateFormatterStyle.ShortStyle
let ampmtext = timeFormatter.stringFromDate(NSDate())
println(ampmtext)
if ampmtext.rangeOfString("M") != nil {
println("12-hour clock")
} else {
println("24-hour clock")
}
我想找到一个用 Objective-C 和 Swift 编写的解决方案,适用于 Mac 和 iPhone,可以检测设备时钟是否显示 24 小时或 12 小时时间。
日期模板功能有一个巧妙的技巧。有一个模板说明符
j
它将转换为小时格式,具体取决于区域设置使用 12 小时还是 24 小时格式。它会变成 h a
表示 12 小时格式(在本例中为 en_US)或 HH
表示 24 小时格式 (en_GB)。
然后你只需检查日期格式是否包含
a
//let locale = NSLocale(localeIdentifier: "de_DE")
//let locale = NSLocale(localeIdentifier: "en_US")
//let locale = NSLocale(localeIdentifier: "en_GB")
let locale = NSLocale.currentLocale()
let dateFormat = NSDateFormatter.dateFormatFromTemplate("j", options: 0, locale: locale)!
if dateFormat.rangeOfString("a") != nil {
println("12 hour")
}
else {
println("24 hour")
}
这也应该考虑格式覆盖。
这与您的检查类似,但您不应尝试检查
AM
或 PM
。这些是英文版本,还有更多。例如,在德国,如果您强制使用 12 小时格式,iOS 将使用 nachm.
和 vorm.
。正确的方法是检查a
的格式。
斯威夫特4
这是对已接受答案的快速 4 解释:
func is24Hour() -> Bool {
let dateFormat = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: Locale.current)!
return dateFormat.firstIndex(of: "a") == nil
}
用途:
if is24Hour() {
// should show 24 hour time
} else {
// should show 12 hour time
}
使用此扩展
extension Locale {
static var is24Hour: Bool {
let dateFormat = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: Locale.current)!
return dateFormat.firstIndex(of: "a") == nil
}
}
随时随地免费使用
if Locale.is24Hour {
// Show 24 hour time
} else {
// Show 12 hour time
}
Mac OS X 菜单栏中使用的日期格式包含在文件
~/Library/Preferences/com.apple.menuextra.clock.plist
中。在我的系统(en_US 语言环境)上,非 24 小时时间如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>DateFormat</key>
<string>EEE h:mm a</string>
<key>FlashDateSeparators</key>
<false/>
<key>IsAnalog</key>
<false/>
</dict>
</plist>
24 小时都这样:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>DateFormat</key>
<string>EEE H:mm</string>
<key>FlashDateSeparators</key>
<false/>
<key>IsAnalog</key>
<false/>
</dict>
</plist>
您可以使用命令行中的
defaults read com.apple.menuextra.clock DateFormat
或 Obj-C 或 Swift 中的 NSUserDefaults
检索格式字符串。然后您可以检查格式字符串是否包含 a
。如果是,则时钟未设置为 24 小时制。
我找到了其他方法来检查它 SwifterSwift
extension Locale {
var is12HourTimeFormat: Bool {
let dateFormatter = DateFormatter()
dateFormatter.timeStyle = .short
dateFormatter.dateStyle = .none
dateFormatter.locale = self
let dateString = dateFormatter.string(from: Date())
return dateString.contains(dateFormatter.amSymbol) || dateString.contains(dateFormatter.pmSymbol)
}
}