objective-c iphone nsdateformatter

objective c - NSDateFormatter con tiempos de 24 horas



nsdateformatter swift (6)

La versión C objetiva de obtener NSDate de una cadena de 24 horas cuando el usuario ha configurado el formato de 12 horas en su iPhone sin cambiar la configuración regional y la zona horaria:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; NSString *localeId = dateFormatter.locale.localeIdentifier; if (! [localeId hasSuffix:@"_POSIX"]) { localeId = [localeId stringByAppendingString:@"_POSIX"]; dateFormatter.locale = [NSLocale localeWithLocaleIdentifier:localeId]; } dateFormatter.dateFormat = @"yyyy-MM-dd''T''HH.mm.ss"; NSDate *date = [dateFormatter dateFromString:dateText];

Tengo un temporizador de cuenta regresiva que cuenta desde la fecha / hora actual hasta una fecha / hora futura específica. Está funcionando muy bien, excepto por un problema. Ingresé la fecha futura usando NSDateFormatter y dateFromString. No parece poder aceptar ninguna hora (hora) más de 12, aunque indica que no es compatible con el reloj de 24 horas. ¿Hay alguna manera de habilitar el soporte de 24 horas o una solución alternativa? Aquí está algo de mi código:

NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; NSDate *myDate = [df dateFromString:@"2010-03-14 15:00:00"];

Gracias


Mi solución en Swift:

let formatter = NSDateFormatter() var defIdentifer = formatter.locale.localeIdentifier if !defIdentifer.hasSuffix("_POSIX") { defIdentifer = defIdentifer+"_POSIX" let locale = NSLocale(localeIdentifier: defIdentifer) formatter.locale = locale } formatter.dateFormat = "HH:mm"


NSDateFormatter sigue el estándar de Unicode para los patrones de fecha y hora . Use ''H'' para la hora en un reloj de 24 horas:

NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSDate *myDate = [df dateFromString:@"2010-03-14 15:00:00"];


Recientemente tuve un problema similar, en lugar de HH , NSDateFormatter ignoró hh , a (símbolo de AM / PM) y G (nombre de la era cíclica) en mi aplicación.

Y me sorprendió descubrir que si voy a la configuración de localización de mi dispositivo y hago una elección aleatoria, todos los fenómenos desaparecen y el error no puede volver a producirse. Muy raro.

Luego probé en el simulador para estudiarlo. Ahí está mi solución:

Después de crear el NSDateFormatter , establezca explícitamente la propiedad del entorno local incluso si está utilizando la configuración regional actual, lo que es más importante, NO use [NSLocale currentLocale] , esta está dañada y puede ser "anulada" por la configuración del usuario, usar systemLocale o crear explícitamente una instancia de NSLocale utiliza un identificador de configuración regional.


Tomado de las preguntas y respuestas técnicas de Apple en NSDateFormatters

P: Estoy usando NSDateFormatter para analizar una fecha de estilo de Internet, pero esto falla para algunos usuarios en algunas regiones. He establecido una cadena de formato de fecha específica; ¿no debería eso obligar a NSDateFormatter a trabajar independientemente de la configuración regional del usuario?

R: No. Aunque la configuración de una cadena de formato de fecha parece funcionar para la mayoría de los usuarios, no es la solución adecuada para este problema. Hay muchos lugares donde las cadenas de formato se comportan de manera inesperada.

Así es como he hecho el mío en Swift:

private let dateFormatter: NSDateFormatter = { let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd''T''HH:mm:ss.SSS''Z''" dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") dateFormatter.timeZone = NSTimeZone.init(forSecondsFromGMT: 0) return dateFormatter }()


Tuve el mismo problema y el uso de HH funcionó solo en algunos dispositivos, como Roger también verificó. Al final, esta fue la solución que funcionó para mí, espero que funcione para otros. Encontrar esta respuesta fue difícil, no hay foros con ella, fue literalmente prueba y error siguiendo la documentación de Apple.

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; [dateFormatter setLocale:enUSPOSIXLocale]; NSString *dateFormat = @"dd/MM/yyyy HH:mm"; //MM for month, mm for minutes [dateFormatter setDateFormat:dateFormat]; [dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; date = [dateFormatter dateFromString:string];