2010-02-01 17 views
24

Estoy teniendo un problema. Recibo cadenas de tiempo entrantes en formato de 12 horas y las convierto 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 salen mal. Aquí hay un código de ejemplo para demostrar:NSDateFormatter dateFromString y iPhone en formato de 24 horas Confusión

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 se 1970-01-01 03:19:00 y elString es "03:19" - MAL

en modo de 12 horas, fecha es 1970-01-01 15:19:00 y elString es "15:19" - DERECHO

Así que ... la pregunta 1: ¿por qué es el dispositivo de 24 horas ¿Configurando la configuración de mi formateo de fecha?

y lo más importante, la pregunta 2: ¿Cómo consigo una conversión apropiada de de 12 horas de tiempo de 24 horas?

Ya tengo el código para detectar si el teléfono está en modo de 24 horas, pero aparte de buscar en la cadena e intercambiar el 3 con un 15, no parece haber una manera clara de hacerlo.

Respuesta

28

No estoy seguro de si todavía lo necesita, pero he tenido un problema similar que se resolvió mediante el establecimiento de la configuración regional para el formateador fecha. 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 en_US_POSIX.

+0

Esta respuesta llegó mucho después de que había elegido otra ruta, pero parece razonable y alguien más la ha verificado, así que la marcaré como respondida. – Silromen

+0

¿Cómo funcionó para usted? No obtuve la configuración de 12 horas. – Hisenberg

+0

Muchas gracias !!!! Funciona ahora ... – harshit2811

6

creo que el @ "h: mm a" debe ser @ "HH: mm a".

Si utiliza el dateformatter pre-construcción en el cacao, todo lo que se tomarán el cuidado de usted.

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

NSDateFormatterShortStyle y NSDateFormatterNoStyle viene en diferentes variedades. Al usarlos, asegúrese de respetar las configuraciones que el usuario ha seleccionado para las fechas y horas.

La conversión del reloj de 12-14 horas está a cargo del SDK, si tiene un modelo o algún objeto de valor para almacenar sus fechas intente mantenerlos como NSDate. De esta forma, puede formatearlos solo cuando necesite mostrarlos. Ahorro de fechas como cadenas podría abrir un mundo de problemas cuando tal vez ellos PARSE de XML en el que el GMT se especifica por separado o intenta sumar y restar NSTimeIntervals.

+0

Gracias. Le di un giro con este código: NSString * theTime = @ "3:19 PM"; NSDateFormatter * timeFormatter = [[[NSDateFormatter alloc] init] liberación automática]; [timeFormatter setTimeStyle: NSDateFormatterShortStyle]; [timeFormatter setDateStyle: NSDateFormatterNoStyle]; NSDate * date = [timeFormatter dateFromString: theTime]; NSString * theString = [timeFormatter stringFromDate: date]; Y la fecha aparece nula. Me encontré con esto antes cuando probé esta ruta, y no está funcionando. Muy frustrante. – Silromen

1

Vale, He dejado un comentario, pero es aplastado todo el código juntos, así que voy a tener que "responder" 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 aparece nula. Me encontré con esto antes cuando probé esta ruta, y no está funcionando. Muy frustrante.

+0

Hola Silromen. Ese enfoque es solo para mostrar fechas y horas. Para crear fechas a partir de cadenas, debe aplicar el formato correcto. Como lo hace aquí: [formatter setDateFormat: @ "h: mm a"]; // "3:19 PM" Pero note el HH en lugar de hh. – RickiG

+0

Gracias por la respuesta, pero eso simplemente no funciona. En el iPhone en el modo de 24 horas, 3:54 PM todavía sale como un objeto de fecha 03:54:00, y en el simulador (con el reloj de mi computadora en modo de 24 horas), fue peor: 12:54:00. – Silromen

13

La razón de este comportamiento es Locale, establecer 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 para las 24 horas y formato de 12 horas

+1

gracias @Conocer, es una locura cómo una línea de código puede cambiar todo :) – DrPatience

+0

Gracias @Meet, funcionó. –

6

pasé de @ "hh: mm: ss" a @ "HH: mm: ss" y el estilo de tiempo se cambió de "1:03 PM" a "13:03". Espero que esto te ayude.

Cuestiones relacionadas