Pregunta

Este código

NSCalendar *calendar =[NSCalendar currentCalendar];
[gregorian setTimeZone:tz];

NSLog(@"%@", [gregorian timeZone]);

NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit) fromDate:[NSDate date]];

[comp setDay:info.day];
[comp setMonth:info.month];
[comp setYear:info.year];
[comp setHour:info.hour];
[comp setMinute:info.minute];
[comp setSecond:info.second];
[comp setTimeZone:tz];  

NSLog(@"%@", [comp timeZone]);
NSLog(@"%@", [gregorian dateFromComponents:comp]);

muestra lo siguiente en la consola:

Europe/Moscow (MSKS) offset 14400 (Daylight)

Europe/Moscow (MSKS) offset 14400 (Daylight)

2011-08-31 20:00:00 +0000

Entonces, la zona horaria para calendario y componentes se especifica correctamente, pero [gregorian dateFromComponents:comp] Devuelve el valor NSDate con la zona horaria incorrecta (GMT).

¿Qué necesito corregir para obtener la zona horaria adecuada?

¿Fue útil?

Solución

La salida que está viendo es perfectamente normal. Si NSLOG A NSDate objeto directamente, obtendrá lo que sea el description El método devuelve, que es la representación GMT de la fecha (pero que no está tallada en piedra).

NSDate Los objetos no están sujetos a zonas horarias. A NSDate representa un absoluto instantáneo en el tiempo medido desde una fecha de referencia. Por ejemplo, al momento de escribir, la fecha actual es algo así como 337035053.199801 (segundos desde la fecha de referencia), que puede representarse como 2011-09-06 20:50:53 GMT o 2011-09-06 22:50:53 CEST. Ambas son diferentes representaciones legibles humanas del mismo fecha.

En conclusión, ¿qué necesita para obtener la zona horaria adecuada? Necesitas usar NSDateFormatter Para obtener una representación de cadena de su NSDate en cualquier zona horaria que desee.

Otros consejos

Esta pregunta aparece con bastante frecuencia y la respuesta es usar un NSDateFormatter Para obtener la salida deseada para el formato de fecha. Actualmente siempre se imprime con la zona horaria GMT. Aquí está la discusión para la documentación para NSDate:

Discusión
No se garantiza que la representación permanezca constante en diferentes versiones del sistema operativo. Para formatear una fecha, debe usar un objeto Formatter de fecha en su lugar (consulte la Guía de formato NSDATEFORMATTERM y de datos)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top