objective objective-c ios nsdate nsdateformatter

objective-c - nsdateformatter objective c



Análisis de fecha/hora en iOS: ¿cómo tratar(o no) las zonas horarias? (3)

El código de análisis de fecha de iOS es correcto: 2011-04-05 16:28:22 -07:00 y 2011-04-05 23:28:22 +0000 representan la misma hora, solo en diferentes zonas horarias. Su único problema es que NSDate no almacena realmente la zona horaria, por lo que las salidas de [date description] utilizan UTC.

Tengo un sitio web ASP.NET MVC 3 que se comunica con mi aplicación iOS a través de JSON. Como parte de los objetos enviados en la respuesta JSON, tengo fechas en el formato de yyyy-MM-dd HH:mm:ss ZZZ que 2011-04-05 16:28:22 -07:00 . ¿Cómo puedo analizar eso en iOS?

Este es el código con el que estoy jugando ahora mismo:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd''T''HH:mm:ssZZZ"]; [dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; NSDate *date = [dateFormatter dateFromString:@"2011-04-05T16:28:22-0700"]; NSLog(@"%@; %@; %@", dateFormatter, date, [NSTimeZone localTimeZone]);

Lo primero que se debe tener en cuenta es que 2011-04-05 16:28:22 -07:00 tiene que verse como el 2011-04-05T16:28:22-0700 , donde una T reemplaza al primer espacio (suponiendo que eso significa tiempo, o donde comienza la parte del tiempo de la cadena?), se elimina el segundo espacio y se eliminan los dos puntos en la zona horaria. Creo que encontraré la forma de formatear la cadena que .NET está enviando para cumplir con la cadena que iOS analizará.

El problema real es que la fecha de salida es 7 horas antes de lo que he enviado en la respuesta JSON. Entonces, las salidas de iOS 2011-04-05 16:28:22 -07:00 como 2011-04-05 23:28:22 +0000 , y eso es incorrecto en lo que respecta a mi aplicación.

La única solución que he encontrado hasta ahora es enviar la fecha en el JSON como 2011-04-05 16:28:22 +00:00 , pero eso también es incorrecto porque estoy modificando la fecha real.

De todos modos, agradecería que alguien le echara un vistazo y me hiciera saber cómo puedo analizar la cadena de fecha .NET está emitiendo a través del formato yyyy-MM-dd HH:mm:ss ZZZ (que supongo que puede reescribirse en yyyy-MM-ddTHH:mm:ssZZZ ) a un objeto NSDate que puedo usar en iOS.


Es casi seguro que es mejor usar la hora UTC en todas partes para el intercambio y no preocuparse por las zonas horarias. Estoy seguro de que puede obtener ese código ASP.NET para hacer eso, y también es más fácil analizar en el extremo receptor. NSDateFormatter utiliza la sintaxis estándar de formato de fecha Unicode, que puede leer here .


No sé si esto es correcto, pero al final encontré que en .NET tengo que hacer DateTime.ToUniversalTime().ToString("yyyy-MM-ddHH:mm:ss") y en el lado de iOS tengo que hacer esto:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]]; [dateFormatter setDateFormat:@"yyyy-MM-ddHH:mm:ss"]; NSDate *date = [dateFormatter dateFromString:@"2011-04-0600:28:27"];

Solo entonces la fecha es correcta cuando NSLog , así que NSLog que finalmente tengo una fecha / hora adecuada.