检测iPhone 24小时时间设置

时间:2012-08-31 11:28:47

标签: xcode cocoa-touch uidatepicker

我使用UIDatePicker来选择时间。我也在自定义选择器的背景,但是我需要2个不同的图像,具体取决于用户是使用12小时模式(显示AM / PM列)还是24小时模式。 如何检测12/24小时的用户设置?

由于

3 个答案:

答案 0 :(得分:34)

甚至比其他人短:

NSString *format = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
BOOL is24Hour = ([format rangeOfString:@"a"].location == NSNotFound);

解释

表示am / pm符号的字符串格式字符为“a”,如Unicode Locale Markup Language – Part 4: Dates中所述。

同一文件还解释了特殊模板符号“j”:

  

这是一个特殊用途的符号。它不得出现在模式或骨架数据中。相反,它保留用于传递给执行灵活日期模式生成的API的骨架。在这样的上下文中,它请求区域设置(h,H,K或k)的首选小时格式,这由h,H,K或k是否以区域设置的标准短时间格式使用来确定。在这种API的实现中,在开始与availableFormats数据匹配之前,'j'必须被h,H,K或k替换。请注意,在传递给API的骨架中使用'j'是让骨架请求区域设置的首选时间周期类型(12小时或24小时)的唯一方法。

Apple的NSDateFormatter documentation中描述了NSString方法dateFormatFromTemplate:options:locale:

  

返回一个本地化的日期格式字符串,表示为指定区域设置适当排列的给定日期格式组件。

因此,该方法将把您作为模板传入的@"j"转换为适合NSDateFormatter的格式字符串。如果此字符串在任何地方包含am / pm符号@"a",那么您知道语言环境(以及操作系统为您查询的其他用户设置)希望显示am / pm。

答案 1 :(得分:4)

Swift(3.x)版本的两个最流行的解决方案,以日期扩展形式:

extension Date {

    static var is24HoursFormat_1 : Bool  {
        let dateString = Date.localFormatter.string(from: Date())

        if dateString.contains(Date.localFormatter.amSymbol) || dateString.contains(Date.localFormatter.pmSymbol) {
            return false
        }

        return true
    }

    static var is24HoursFormat_2 : Bool {
        let format = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: Locale.autoupdatingCurrent)
        return !format!.contains("a")
    }

    private static let localFormatter : DateFormatter = {
        let formatter = DateFormatter()

        formatter.locale    = Locale.autoupdatingCurrent
        formatter.timeStyle = .short
        formatter.dateStyle = .none

        return formatter
    }()
}

用法:

Date.is24HoursFormat_1
Date.is24HoursFormat_2

Swift(2.0)版本的NSDate扩展形式的两个最流行的解决方案:

extension NSDate {

    class var is24HoursFormat_1 : Bool  {
        let dateString = NSDate.localFormatter.stringFromDate(NSDate())

        if dateString.containsString(NSDate.localFormatter.AMSymbol) || dateString.containsString(NSDate.localFormatter.PMSymbol) {
            return false
        }

        return true
    }

    class var is24HoursFormat_2 : Bool {
        let format = NSDateFormatter.dateFormatFromTemplate("j", options: 0, locale: NSLocale.autoupdatingCurrentLocale())
        return !format!.containsString("a")
    }

    private static let localFormatter : NSDateFormatter = {
        let formatter = NSDateFormatter()

        formatter.locale    = NSLocale.autoupdatingCurrentLocale()
        formatter.timeStyle = .ShortStyle
        formatter.dateStyle = .NoStyle

        return formatter
    }()
}

请注意,Apple表示关注NSDateFormatter(Date Formatters):

  

创建日期格式化程序并不是一种廉价的操作。如果你有可能的话   为了经常使用格式化程序,缓存通常更有效   单个实例,而不是创建和处理多个实例。   一种方法是使用静态变量。

这就是静态让

的原因

其次,您应该使用NSLocale.autoupdatingCurrentLocale()(对于is24HoursFormat_1),这样您将始终获得实际的当前状态。

答案 2 :(得分:3)

并且可能还有很多很多......