Вопрос по uidatepicker, cocoa-touch, xcode – Обнаружение iPhone 24-часовой установки времени

6

Я использую UIDatePicker для выбора времени. Я также настраиваю фон выбора, однако мне нужно 2 разных изображения в зависимости от того, использует ли пользователь 12-часовой режим (который отображает колонку AM / PM) или 24-часовой режим. Как я могу определить настройки пользователей для времени 12/24 часа?

Спасибо

Ваш Ответ

3   ответа
34

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

Символом форматирования строки для представления символа am / pm является «a», как описано вЯзык разметки локали Unicode & # x2013; Часть 4: Даты.

В том же документе также объясняется специальный символ шаблона «j»:

This is a special-purpose symbol. It must not occur in pattern or skeleton data. Instead, it is reserved for use in skeletons passed to APIs doing flexible date pattern generation. In such a context, it requests the preferred hour format for the locale (h, H, K, or k), as determined by whether h, H, K, or k is used in the standard short time format for the locale. In the implementation of such an API, 'j' must be replaced by h, H, K, or k before beginning a match against availableFormats data. Note that use of 'j' in a skeleton passed to an API is the only way to have a skeleton request a locale's preferred time cycle type (12-hour or 24-hour).

NSString методdateFormatFromTemplate:options:locale: описано в AppleNSDateFormatter documentation:

Returns a localized date format string representing the given date format components arranged appropriately for the specified locale.

Итак, что этот метод будет делать, это повернуть@"j" Вы передаете в качестве шаблона в строку формата, подходящую дляNSDateFormatter, Если эта строка содержит символ am / pm@"a" в любом месте, то вы знаете, что языковой стандарт (и другие пользовательские настройки, запрашиваемые ОС для вас) хочет отображать am / pm.

Я собирался проголосовать за ваш ответ как за неработающий, пока не прочитал его поближе. Это умно. Хороший!
Просто добавить, что это не будет работать на симуляторе.
3
Вау, спасибо. Я сделал поиск в Google, который обычно показывает результаты переполнения стека, но я оказался совершенно пустым! Darren
4

ы:

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 (Форматеры даты) :

Creating a date formatter is not a cheap operation. If you are likely to use a formatter frequently, it is typically more efficient to cache a single instance than to create and dispose of multiple instances. One approach is to use a static variable.

Вот причина для статического пусть

Во-вторых, вы должны использовать NSLocale.autoupdatingCurrentLocale () (для is24HoursFormat_1), таким образом вы всегда будете получать фактическое текущее состояние.

Похожие вопросы