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?

War es hilfreich?

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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top