suena - tiempo en pantalla iphone contraseña
¿Cómo puedo determinar si iPhone está configurado para una visualización de 12 horas o 24 horas? (4)
Creí haber visto algo que respondía a esto recientemente, pero ahora no puedo encontrarlo. Aquí está el código que estoy usando ahora para determinar si la configuración es para mostrar la hora de 24 horas. Funciona para mí en los EE. UU., Pero no sé si funcionará en todos los entornos. ¿Es suficiente o hay una mejor manera de averiguar la configuración actual para esto?
+(BOOL) use24HourClock
{
BOOL using24HourClock = NO;
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale: [NSLocale currentLocale]];
[dateFormatter setDateStyle:kCFDateFormatterNoStyle];
[dateFormatter setTimeStyle:kCFDateFormatterShortStyle];
// get date/time (1Jan2001 0000UTC)
NSDate* midnight = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:0];
NSString* dateString = [dateFormatter stringFromDate: midnight];
// dateString will either be "15:00" or "16:00" (depending on DST) or
// it will be "4:00 PM" or "3:00 PM" (depending on DST)
using24HourClock = ([dateString length] == 5);
[midnight release];
[dateFormatter release];
return using24HourClock;
}
Acabo de hacer una pregunta similar aquí y he logrado encontrar una manera decente de determinar esto con una pequeña función que agregué a una categoría de NSLocale
. Parece ser bastante preciso y no ha encontrado ningún problema al probarlo en varias regiones.
@implementation NSLocale (Misc)
- (BOOL)timeIs24HourFormat {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:self];
[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 is24Hour = (amRange.location == NSNotFound && pmRange.location == NSNotFound);
[formatter release];
return is24Hour;
}
@end
¡Espero que esto ayude!
En Swift 4:
let formatString: String = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: Locale.current)!
let hasAMPM = formatString.contains("a")
Esta es la mejor manera de hacerlo:
NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
NSRange containsA = [formatStringForHours rangeOfString:@"a"];
BOOL hasAMPM = containsA.location != NSNotFound;
en Swift:
let formatString: NSString = NSDateFormatter.dateFormatFromTemplate("j", options: 0, locale: NSLocale.currentLocale())!
let hasAMPM = formatString.containsString("a")
Swift 4:
let formatString = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: Locale.current)!
let hasAMPM = formatString.contains("a")
Esto usa una cadena de plantilla de fecha especial llamada "j". De acuerdo con la especificación de ICU , "j" ...
solicita el formato de hora preferido para la configuración regional (h, H, K o k), según lo determinado por 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).
Esa última oración es importante. Es "la única forma de que un esqueleto solicite el tipo de ciclo de tiempo preferido de una localidad". Como NSDateFormatter
y NSCalendar
están construidos en la biblioteca de la ICU, lo mismo es válido aquí.
Le di una oportunidad a la respuesta de Dave, pero al probar con la configuración regional alemana, una región donde se usa un ciclo de 24 horas, me di cuenta de que sería mejor buscar H o k en la cadena de formato en lugar de a , y que las subcadenas citadas deberían ser ignorado
Para la configuración regional alemana, obtengo "HH a" cuando solicito el formato de fecha para la plantilla "j" en el simulador de iOS, y "HH ''Uhr''" en el dispositivo. (No entiendo por qué hay una diferencia en absoluto)
Aquí hay una categoría para NSLocale
que uso para verificar el ciclo de 24 horas:
@interface NSLocale (TwentyFourHourTimeCycleCheck)
- (BOOL)uses24HourTimeCycle;
@end
@implementation NSLocale (TwentyFourHourTimeCycleCheck)
- (BOOL)uses24HourTimeCycle
{
BOOL uses24HourTimeCycle = NO;
NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:self];
NSScanner *symbolScanner = [NSScanner scannerWithString:formatStringForHours];
NSString *singleQuoteCharacterString = @"''";
// look for single quote characters, ignore those and the enclosed strings
while ( ![symbolScanner isAtEnd] ) {
NSString *scannedString = @"";
[symbolScanner scanUpToString:singleQuoteCharacterString intoString:&scannedString];
// if ''H'' or ''k'' is found the locale uses 24 hour time cycle, and we can stop scanning
if ( [scannedString rangeOfString:@"H"].location != NSNotFound ||
[scannedString rangeOfString:@"k"].location != NSNotFound ) {
uses24HourTimeCycle = YES;
break;
}
// skip the single quote
[symbolScanner scanString:singleQuoteCharacterString intoString:NULL];
// skip everything up to and including the next single quote
[symbolScanner scanUpToString:singleQuoteCharacterString intoString:NULL];
[symbolScanner scanString:singleQuoteCharacterString intoString:NULL];
}
return uses24HourTimeCycle;
}
@end