Nscalendar dateFromponents: GMT TimeZone en lugar de SystemtimeNone
-
27-10-2019 - |
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?
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)