Question

Ce code

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]);

affiche les éléments suivants dans la console:

Europe/Moscow (MSKS) offset 14400 (Daylight)

Europe/Moscow (MSKS) offset 14400 (Daylight)

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

Ainsi, le fuseau horaire pour le calendrier et les composants est correctement spécifié, mais retourne [gregorian dateFromComponents:comp] valeur NSDate avec mauvais fuseau horaire (GMT).

Que dois-je corriger pour obtenir fuseau horaire approprié?

Était-ce utile?

La solution

La sortie que vous voyez est tout à fait normal. Si vous NSLog un objet NSDate directement, vous obtiendrez tout ce que la méthode retourne de description, qui est la représentation GMT de la date (mais qui ne sont pas gravés dans la pierre).

Les objets de NSDate ne sont pas soumis à des fuseaux horaires. Un NSDate représente un absolue instant dans le temps mesuré à partir d'une date de référence. Par exemple, au moment de l'écriture, la date actuelle est quelque chose comme 337035053.199801 (secondes depuis la date de référence), qui peut être représenté comme 2011-09-06 20:50:53 GMT ou 2011-09-06 22:50:53 CEST. Les deux sont différentes représentations lisibles par l'homme du même jour.

En conclusion, qu'est-ce que vous avez besoin pour obtenir le fuseau horaire approprié? Vous devez utiliser NSDateFormatter pour obtenir une représentation de chaîne de votre NSDate dans un fuseau horaire comme vous.

Autres conseils

Cette question revient assez souvent et la réponse est d'utiliser NSDateFormatter pour obtenir la sortie souhaitée pour le format de date. Actuellement, il est toujours imprimé avec le fuseau horaire GMT. Voici la discussion de la documentation

scroll top