2012-08-31 22 views
5

Estoy usando un UIDatePicker para seleccionar una hora. También estoy personalizando el fondo del selector, sin embargo, necesito 2 imágenes diferentes dependiendo de si el usuario está usando el modo de 12 horas (que muestra la columna AM/PM) o el modo de 24 horas. ¿Cómo puedo detectar la configuración de los usuarios para la hora de 12/24 horas?Detectar configuración de 24 horas de iPhone

Gracias

Respuesta

3

y es probable que haya muchos, muchos más ...

+0

Wow, gracias. Hice una búsqueda en Google que normalmente muestra los resultados de desbordamiento de pila, pero salí completamente en blanco. – Darren

31

incluso más corto que los otros:

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

Explicación

El carácter de formato de cadena para representar el símbolo AM/PM es "A", como se documenta en Unicode Locale Markup Language – Part 4: Dates.

El mismo documento también explica el símbolo plantilla especial "j":

Este es un símbolo de propósito especial. No debe ocurrir en los datos de patrón o esqueleto. En cambio, está reservado para su uso en esqueletos pasados ​​a API que realizan generación de patrones de fecha flexibles. En tal contexto, solicita el formato de hora preferido para la configuración regional (h, H, K o k), según lo determine si h, H, K o k se usa en el formato estándar de corto tiempo para la configuración regional. En la implementación de dicha API, 'j' debe reemplazarse por h, H, K o k antes de comenzar una coincidencia con los datos de los formatos disponibles. Tenga en cuenta que el uso de 'j' en un esqueleto pasado a una API es la única forma de que un esqueleto solicite el tipo de ciclo de tiempo preferido de una localidad (12 horas o 24 horas).

El NSString método dateFormatFromTemplate:options:locale: se describe en NSDateFormatter documentation de Apple:

Devuelve una cadena formato de fecha localizada en representación de los componentes de formato fecha dada dispuestos apropiadamente para el entorno local especificado.

lo tanto, lo que el método va a hacer es girar el @"j" se pasa en como una plantilla para una cadena de formato adecuado para NSDateFormatter. Si esta cadena contiene el símbolo am/pm @"a" en cualquier lugar, entonces usted sabe que la configuración regional (y otras configuraciones de usuario que el sistema operativo está interrogando) quiere que se muestre am/pm.

+0

Estaba a punto de votar su respuesta diciendo que no funcionaba, hasta que la leí mucho más de cerca. Eso es inteligente. ¡Buena esa! – Benjohn

+0

Solo para agregar que esto no funcionará en el simulador. – GuybrushThreepwood

4

Swift (3.x) versión de dos soluciones más populares en forma de extensión Fecha:

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 
    }() 
} 

Uso:

Date.is24HoursFormat_1 
Date.is24HoursFormat_2 

Swift (2.0) versión de dos soluciones más populares en forma de extensión 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 
    }() 
} 

Tenga en cuenta que Apple dice siguiente en NSDateFormatter (Date Formatters):

Crear un formateador fecha no es una operación barata. Si es probable que use un formateador con frecuencia, generalmente es más eficiente cachear una sola instancia que crear y deshacerse de varias instancias. Un enfoque es usar una variable estática.

Esa es la razón por la estática vamos

En segundo lugar se debe utilizar NSLocale.autoupdatingCurrentLocale() (para is24HoursFormat_1), de esa manera que siempre obtendrá el estado actual real.

Cuestiones relacionadas