2010-09-22 9 views
6

Estoy usando un NSDateFormatter para formatear un NSDate con el formato "HH: mm 'en' dd MMMM YYYY".NSDateFormatter cuando el iPhone está configurado en el reloj de 12 horas

Este es el código que he escrito:

[dateFormatter setDateFormat:@"HH:mm 'on' dd MMMM YYYY"]; 
[dateFormatter setLocale:[NSLocale currentLocale]]; 

entonces yo soy la actualización de una etiqueta para mostrar "Datos de 12:45 el 22 septiembre 2010", utilizando el método stringFromDate.

NSString *timeAndDateUpdated = [[NSString alloc] initWithFormat:@"Data from %@.", [dateFormatter stringFromDate:date]] 

La etiqueta se actualiza correctamente si el tiempo en el iPhone se establece en 24 horas, pero si se establece en 12 horas, la etiqueta muestra "Datos de (null)".

¿Alguien sabe cómo resolver este problema?

Gracias.

+0

Creo que mi respuesta a continuación, probablemente debería ser la respuesta aceptada en esto. ¿Puedes cambiar OP si estás de acuerdo? –

Respuesta

6

Si la fecha se presenta únicamente al usuario (el "on" lo sugiere), no forzaría un formato de fecha. Es mucho más agradable de usar las larga/media/fecha y hora corta estilos, que se comportan de acuerdo al formato de la región del usuario:

[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterNoStyle]; 

[timeFormatter setDateStyle:NSDateFormatterNoStyle]; 
[timeFormatter setTimeStyle:NSDateFormatterMediumStyle]; 

NSString * timeAndDate = [NSString stringWithFormat:"%@ on %@", 
    [timeFormatter stringFromDate:date], 
    [dateFormatter stringFromDate:date]]; 

También tenga en cuenta que la configuración de un NSDateFormatter es increíblemente caros (unos 10 ms IIRC) . Está bien si solo vas a mostrarlo una vez y no actualizarlo muy seguido, pero hace que el desplazamiento sea un poco lento si tienes una fecha por celda de tabla. Hace poco hice un gráfico-dibujo 50 veces más rápido almacenando en caché los formateadores de fecha ...

+0

Gracias. Pensé que estaría bien forzar el formato de datos porque la aplicación solo estará disponible en el Reino Unido. ¿Todavía es mejor usar tu método? Además, la fecha se muestra una vez en la pantalla y no se cambia con mucha frecuencia. –

+0

El usuario aún puede configurar el formato de fecha (por ejemplo, 12 contra 24 horas); generalmente es una buena idea respetar los deseos del usuario. –

0

Ejecuté este código en 3.1.2 y 4.1 con configuraciones de 12 y 24 horas y funcionó bien.

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"HH:mm 'on' dd MMMM YYYY"]; 
    [dateFormatter setLocale:[NSLocale currentLocale]]; 

    NSString *timeAndDateUpdated = [NSString stringWithFormat:@"Data from %@.", [dateFormatter stringFromDate:[NSDate date]]]; 

    NSLog(@"%@", timeAndDateUpdated); 

Si este código no funciona para usted, comprobar las extensiones/categorías para NSDateformatter o NSDate personalizados.

14

Me acabo de topar con esto también.

Parece que NSDateFormatter analiza las fechas según la configuración regional, ¡incluso si especifica explícitamente una cadena de formato de fecha!

Por lo tanto, en este caso, se está ignorando el reloj HH de 24 horas y está tratando de analizar utilizando el reloj de 12 horas como está configurado en el dispositivo.

La manera de solucionarlo es anular explícitamente la configuración regional de NSDateFormatter; en este contexto a en_US_POSIX forzará el reloj de 24 horas ejemplo para ser utilizado al analizar la hora, es decir,

[dateFormatter setDateFormat:@"HH:mm 'on' dd MMMM YYYY"]; 
[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]]; 
+0

Gracias por actualizar stackoverflow Nathan, y bienvenido, upvoted. –

Cuestiones relacionadas