NSDateFormatter 检测 OS X 和 iOS 中的 24 小时时钟

问题描述 投票:0回答:5

我想检查用户是否在 OS X 和 iOS 中选择了 12 小时制或 24 小时制作为他们的偏好。所以我想检测用户是否做了以下操作:

  • 在 Mac 上,系统偏好设置为“日期和时间”,使用 24 小时制
  • 在 iPhone 上,首选项位于“设置”、“常规”、“日期和时间”、“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 小时时间。

swift nsdate nsdateformatter
5个回答
40
投票

日期模板功能有一个巧妙的技巧。有一个模板说明符

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
的格式。


22
投票

斯威夫特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
}

5
投票

使用此扩展

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
}

1
投票

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 小时制。


0
投票

我找到了其他方法来检查它 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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.