NSDateFormatter 在 OS X 和 iOS 中检测 24 小时制

NSDateFormatter detect 24-hour clock in OS X and iOS

我想检查一下用户在 OS X 和 iOS 中是否选择了 12 小时制或 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")
}

这也应该考虑格式覆盖。

这类似于您的检查,但您不应尝试检查 AMPM。这些是英文版本,还有很多。例如在德国,如果您强制使用 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
}