NSDateFormatter 在 OS X 和 iOS 中检测 24 小时制
NSDateFormatter detect 24-hour clock in OS X and iOS
我想检查一下用户在 OS X 和 iOS 中是否选择了 12 小时制或 24 小时制作为他们的偏好。所以我想检测用户是否做了以下操作:
- 在 Mac 上,系统偏好设置为日期和时间,使用 24 小时制
- 在 iPhone 上,首选项位于设置、常规、日期和时间、24 小时制
我目前有以下代码,但它总是 returns 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")
}
我想为 Mac 和 iPhone 找到一个用 Objective-C 和 Swift 编写的解决方案,可以检测设备时钟是否显示 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
的格式。
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 中的 NSUserDefaults
或 Swift 来检索格式字符串。然后您可以检查格式字符串是否包含 a
。如果是,则时钟未设置为 24 小时制。
Swift 4
这是对已接受答案的 swift 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
}
我想检查一下用户在 OS X 和 iOS 中是否选择了 12 小时制或 24 小时制作为他们的偏好。所以我想检测用户是否做了以下操作:
- 在 Mac 上,系统偏好设置为日期和时间,使用 24 小时制
- 在 iPhone 上,首选项位于设置、常规、日期和时间、24 小时制
我目前有以下代码,但它总是 returns 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")
}
我想为 Mac 和 iPhone 找到一个用 Objective-C 和 Swift 编写的解决方案,可以检测设备时钟是否显示 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
的格式。
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 中的 NSUserDefaults
或 Swift 来检索格式字符串。然后您可以检查格式字符串是否包含 a
。如果是,则时钟未设置为 24 小时制。
Swift 4
这是对已接受答案的 swift 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
}