NSCalendar dateFromComponents: fuseau horaire GMT au lieu de systemTimeZone
-
27-10-2019 - |
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é?
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