NSCalendar -Datum von Komponenten: GMT Timezone anstelle von SystemTimeZone
-
27-10-2019 - |
Frage
Dieser 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]);
Zeigt die folgenden in der Konsole an:
Europe/Moscow (MSKS) offset 14400 (Daylight)
Europe/Moscow (MSKS) offset 14400 (Daylight)
2011-08-31 20:00:00 +0000
Die Zeitzone für Kalender und Komponenten wird also korrekt angegeben, aber [gregorian dateFromComponents:comp]
Gibt den NSDate -Wert mit falscher Zeitzone (GMT) zurück.
Was muss ich korrigieren, um die richtige Zeitzone zu erhalten?
Lösung
Die Ausgabe, die Sie sehen, ist völlig normal. Wenn Sie nslog a NSDate
Objekt direkt, Sie erhalten alles das, was die description
Methodenrückgabe, was die GMT -Darstellung des Datums ist (aber das ist nicht in Stein gemeißelt).
NSDate
Objekte unterliegen nicht Zeitzonen. EIN NSDate
repräsentiert an absolut sofort aus einem Referenzdatum gemessen. Zum Zeitpunkt des Schreibens zum Beispiel ist das aktuelle Datum so etwas wie 337035053.199801
(Sekunden seit Referenzdatum), die als dargestellt werden können 2011-09-06 20:50:53 GMT
oder 2011-09-06 22:50:53 CEST
. Beide sind unterschiedliche lesbare Darstellungen der menschlichen gleich Datum.
Was brauchen Sie abschließend, um die richtige Zeitzone zu erhalten? Sie müssen verwenden NSDateFormatter
um eine String -Darstellung von Ihrer zu erhalten NSDate
In jedem Zeitzone mögen Sie.
Andere Tipps
Diese Frage erscheint ziemlich oft und die Antwort lautet, eine zu verwenden NSDateFormatter
Um die gewünschte Ausgabe für das Datumsformat zu erhalten. Derzeit wird es immer mit der GMT -Zeitzone gedruckt. Hier ist die Diskussion für die Dokumentation für NSDate
:
Diskussion
Es wird nicht garantiert, dass die Darstellung über verschiedene Freisetzungen des Betriebssystems konstant bleibt. Um ein Datum zu formatieren, sollten Sie stattdessen ein Datum -Formatter -Objekt verwenden (siehe NSDateFormatter- und Datenformatierungshandbuch)