NSDateFormatter Datefstring y iPhone en formato de 24 Horas Confusión


Estoy teniendo un problema. Recibo cadenas de tiempo entrantes en formato de 12 horas, y las estoy convirtiendo en objetos NSDate. Cuando el iPhone está en formato de 12 horas, no hay problema. Pero cuando está en formato de 24 horas, las cosas van mal. Aquí hay un código de ejemplo para demostrar:

NSString *theTime = @"3:19 PM";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"h:mm a"]; // "3:19 PM"
NSDate *date = [formatter dateFromString:theTime];
NSString *theString = [formatter stringFromDate:date];

En el modo de 24 horas, la fecha es 1970-01-01 03: 19: 00, y theString es "3: 19" - INCORRECTO

En el modo de 12 horas, fecha es 1970-01-01 15: 19: 00, y theString es " 3: 19 PM" - DERECHA

So... pregunta 1: ¿por qué la configuración de 24 horas del dispositivo reemplaza mi configuración de formateador de fecha?

Y más importante, pregunta 2: ¿Cómo puedo obtener una conversión adecuada de 12 horas a 24 horas?

Ya tengo código para detectar si el teléfono está en modo de 24 horas, pero aparte de cavar en la cadena e intercambiar el 3 con un 15, no parece haber una forma limpia de hacer esto.

Author: AstroCB, 2010-02-01

5 answers

No estoy seguro de si todavía lo necesita, pero he tenido un problema similar que se resolvió estableciendo la configuración regional para el formateador de fechas. Es decir, si desea forzarlo al modo de 12 horas, independientemente de la configuración del modo de 24/12 horas del usuario, debe establecer la configuración regional en_US_POSIX.

 28
Author: SVD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-03 14:32:42

La razón de este comportamiento es la configuración regional, establezca la configuración regional correcta

    NSString *strAgendaDate = @"01/17/2012 12:00 AM";
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

    [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];

    [dateFormatter setDateFormat:AgendaDateFormatForMeeting];
    NSDate *meetingDate = [dateFormatter dateFromString:aStrDate];
    [dateFormatter setDateFormat:AgendaDateRepresentation];
    strAgendaDate = [dateFormatter stringFromDate:meetingDate];

Funciona tanto en formato de 24 horas como de 12 horas

 13
Author: Meet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-12 12:03:57

Creo que el @"h:mm a" debería ser @"HH:mm a".

Si utiliza el dateformatter pre-build en cocoa, todo se encargará de usted.

NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease];
[timeFormatter setTimeStyle:NSDateFormatterShortStyle];
[timeFormatter setDateStyle:NSDateFormatterNoStyle];

NSDateFormatterShortStyle y NSDateFormatterNoStyle viene en diferentes variedades. El uso de estos se asegurará de respetar la configuración que el usuario ha seleccionado para las fechas y horas.

El SDK se encarga de la conversión del reloj de 12-14 horas, si tiene un modelo o algún objeto de valor para almacenar sus fechas, intente mantenerlos como NSDate. De esta manera usted puede formatearlos solo cuando necesite mostrarlos. Guardar fechas como cadenas podría abrir un mundo de problemas cuando tal vez las analice desde xml donde se especifica el GMT por separado o intente sumar y restar NSTimeIntervals.

 6
Author: RickiG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-01 00:24:43

He cambiado de @"hh:mm:ss" a @"HH:mm:ss" y de estilo de hora se cambió por el de "1:03 PM" a "13:03". Espero que esto te ayude.

 6
Author: Vladimir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-28 09:04:44

De acuerdo, dejé un comentario, pero aplastó todo el código, así que tendré que" responder " a mi pregunta con un comentario:

Gracias. Le di un giro con este código:

NSString *theTime = @"3:19 PM"; 
NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease];       
[timeFormatter setTimeStyle:NSDateFormatterShortStyle]; 
[timeFormatter setDateStyle:NSDateFormatterNoStyle]; 
NSDate *date = [timeFormatter dateFromString:theTime]; 
NSString *theString = [timeFormatter stringFromDate:date]; 

Y la fecha es nula. Me encontré con esto antes cuando probé esta ruta, y no está funcionando. Muy frustrante.

 1
Author: Silromen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-01 00:49:54