2011-09-16 26 views
34

¿Hay alguna manera de detectar si el dispositivo actual utiliza 12 horas nuestro formato de 24 horas, de modo que puedo usar un NSDateFormatter para 12 horas y una para 24 horas dependiendo del idioma del usuario/configuración de ubicación? Justo como UIDatePicker detecta y muestra el selector AM/PM si es formato 12h.Detecta si el formato de hora está en formato de 12 horas o 24 horas

+5

ya ha respondido [aquí] (http://stackoverflow.com/q/1929958/154803) – progrmr

+0

@progrmr que es definitivamente una una buena solución para determinar si el reloj de 24 horas está configurado o no, pero depende del comportamiento de los Formateadores de fecha. El OP quería que esta información formateara una cadena usando el formateador de fechas para que la solución implique agregar una categoría de clase, crear un formateador de fechas, convertir una fecha en una cadena, buscar la cadena dos veces para símbolos AM/PM y luego ramificar su código formatee con formato de 12 horas o de 24 horas cuando ya lo haga por usted. – Joe

+1

@Joe Lo sé, pero a veces necesitas saber por otros motivos, como poner el "AM" en una UILabel separada con una fuente diferente, el OP no estaba claro exactamente por qué quería saberlo. – progrmr

Respuesta

78

Me di cuenta, es bastante fácil. Acabo de añadir este código a viewDidLoad:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setLocale:[NSLocale currentLocale]]; 
[formatter setDateStyle:NSDateFormatterNoStyle]; 
[formatter setTimeStyle:NSDateFormatterShortStyle]; 
NSString *dateString = [formatter stringFromDate:[NSDate date]]; 
NSRange amRange = [dateString rangeOfString:[formatter AMSymbol]]; 
NSRange pmRange = [dateString rangeOfString:[formatter PMSymbol]]; 
BOOL is24h = (amRange.location == NSNotFound && pmRange.location == NSNotFound); 
[formatter release]; 
NSLog(@"%@\n",(is24h ? @"YES" : @"NO")); 

Y es perfectamente retornos YES o NO dependiendo de la configuración regional.

+0

Gracias por su respuesta. Me ayuda mucho. – Gypsa

+0

Esto solo funciona si el calendario local usa el mismo formato que el teléfono, pero en iOS puede establecer específicamente el formato de tiempo que podría hacerlo diferente de lo que se usa en el calendario local. – yoeriboven

1

Aquí está la versión Swift:

func using12hClockFormat() -> Bool { 

    let formatter = NSDateFormatter() 
    formatter.locale = NSLocale.currentLocale() 
    formatter.dateStyle = NSDateFormatterStyle.NoStyle 
    formatter.timeStyle = NSDateFormatterStyle.ShortStyle 

    let dateString = formatter.stringFromDate(NSDate()) 
    let amRange = dateString.rangeOfString(formatter.AMSymbol) 
    let pmRange = dateString.rangeOfString(formatter.PMSymbol) 

    return !(pmRange == nil && amRange == nil) 
} 
+0

Está utilizando el operador ternario como NOT, lo que hace que sea más difícil de leer. La línea de retorno debería ser 'return! (PmRange == nil && amRange == nil)' – EmilioPelaez

+0

Ahh, claro, gracias :) He editado eso ahora .. – Wiingaard

10

Y aquí es una versión actualizada Swift 3.0

func using12hClockFormat() -> Bool { 

    let formatter = DateFormatter() 
    formatter.locale = Locale.current 
    formatter.dateStyle = .none 
    formatter.timeStyle = .short 

    let dateString = formatter.string(from: Date()) 
    let amRange = dateString.range(of: formatter.amSymbol) 
    let pmRange = dateString.range(of: formatter.pmSymbol) 

    return !(pmRange == nil && amRange == nil) 
} 
3

esto es rápida solución que trabajó para mí, los dos anteriores no lo hicieron.

let dateString : String = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: Locale.current)!

if(dateString.contains("a")){ // 12 h format return true }else{ // 24 h format return false }

+0

La mayoría de las respuestas correctas creo –

0

categoría Objetivo C NSDate+Extensions:

@import Foundation; 

@interface NSDate (Extensions) 

- (NSString *)getTimeString; 

@end 


#import "NSDate+Extensions.h" 

@implementation NSDate (Extensions) 

- (NSString *)getTimeString 
{ 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    if ([self isTwelveHourDateFormat]) { 
     [formatter setDateFormat:@"hh:mm\ndd MMM"]; 
    } 
    else { 
     [formatter setDateFormat:@"HH:mm\ndd MMM"]; 
    } 
    return [formatter stringFromDate:self]; 
} 

- (BOOL)isTwelveHourDateFormat 
{ 
    NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]]; 
    return [dateFormat containsString:@"a"]; 
} 

@end 
Cuestiones relacionadas