NSDate Format, das falsches Datum ausgibt

8

Ich habe eine NSString (ex. "2011-04-12 19:23:39"), und was ich getan habe, um es zu einem NSDate zu formatieren, war das Folgende:

%Vor%

aber was es ausgibt, wenn ich das Datum nslog, ist dies:

2011-04-12 23:23:39 +0000

was ungefähr 4 Stunden dauert. Gibt es etwas, das ich vermisst habe? Möglicherweise ein Zeitzonenproblem?

    
jylee 03.06.2011, 15:18
quelle

5 Antworten

2

NSDateFormatter verwendet das aktuelle Zeitzone des Geräts beim Erstellen des NSDate-Objekts. NSDate speichert das Datum / die Uhrzeit in GMT. Daher gibt NSLog standardmäßig das Datum / die Uhrzeit in GMT + 0 aus. Also, es ist nichts falsch mit Ihrem Code. Wenn Sie jetzt das NSDate in Ihre aktuelle Zeitzone ausgeben wollen, müssen Sie ein NSDateFormatter-Objekt verwenden.

    
Black Frog 03.06.2011, 16:06
quelle
5

Die Antwort lautet, dass das Datum GMT zurückgegeben wird, sofern nicht anders angegeben. Sie können Ihre Zeitzone so einstellen, dass das korrekte Datum angezeigt wird. Wenn Sie planen, das Datum in der App zu verwenden, um irgendetwas einzustellen (wie localNotification time oder Event), müssen Sie etwas Besonderes mit dem Datum machen, denn wenn Sie das Datum im iPhone einstellen, wird es als GMT Zeit eingestellt und ist ausgeschaltet um ein paar Stunden. (in deinem Fall 4 Stunden). Ich mache genau das, was ich gerade in einer meiner Apps beschrieben habe.

Ich habe ein Durcheinander gemacht, um zu versuchen, dass das richtig funktioniert, ohne dass die Stunden aus sind. Es war eine riesige PITA, um herauszufinden, aber es funktioniert jetzt. Ich habe meinen Code kopiert, eingefügt und bearbeitet, um ihn zu teilen. Wieder ist es chaotisch, aber es funktioniert! Der PickerChanged erhält seine Informationen von einem UIDatePicker

Verwenden Sie den folgenden Code. Um Ihre Frage zu beantworten, können Sie bei "Zieldatum" anhalten. Dadurch erhalten Sie die korrigierte Zeit für Ihre aktuelle Zeitzone. Ich habe gerade den zusätzlichen Fall zur Verfügung gestellt, dass Sie versuchten, das Datum im Telefon irgendwo zu verwenden.

HINWEIS: Für ein kurzes Beispiel setze ich die Ereigniserinnerung in die gleiche Funktion wie den Datumswahlschalter, was Sie NICHT tun möchten, da sonst jedes Mal, wenn das Rad im Datumswähler rollt, viele Erinnerungen gesetzt werden.

Der Code ist unten.

%Vor%     
Louie 03.06.2011 17:29
quelle
1

In Ihrem Daten- und Datumsformatierer wird der Zeitzonenspezifizierer weggelassen. So etwas wie das:

%Vor%

Würde funktionieren - das Z ist der Zeitzonenspezifizierer und analysiert sowohl numerische Offsets als auch Zeitzonencodes. Obwohl in Ihrem Fall, da Ihr Eingabe-Datum keine TimeZone Informationen hat, wird es nicht funktionieren.

Ihre korrekte Zeitleiste sollte wie "2011-04-12 19:23:39 -0400" oder "2011-04-12 19:23:39 EST" sein.

Abhängig davon, woher Sie Ihr Datum bekommen, sollten Sie das korrigieren, um ein vollqualifiziertes Datum zu erzeugen. Wenn Sie das nicht können, müssen Sie Zeitzonen-Offsets mit dem Server vereinbaren oder einfach einen Zeitzonen-Offset 'fest codieren' füge diese Anzahl von Sekunden zu deinem NSDate hinzu.

    
Roger Nolan 03.06.2011 15:30
quelle
1

Das Datum wird protokolliert, da ein UTC-Datum am Ende von +0000 angezeigt wird. Das Datumsformat, das Sie zum Analysieren der Zeichenfolge verwenden, setzt Ihre lokale Zeitzone voraus, die vermutlich 4 Stunden hinter der UTC mit Sommerzeit und den Standard-5 Stunden liegt.

    
JeremyP 03.06.2011 15:35
quelle
1

Verwenden Sie -[NSDateFormatter setTimeZone:] , um dem Datumsformatierer Zeitzoneninformationen bereitzustellen. Sie können die lokale Zeitzone verwenden, oder wenn Sie eine feste Zeitzone für die Datumsinformationen haben, empfehle ich, die Zeitzone mit dem Namen (z. B. "Amerika / Ost") anstelle der Abkürzung (z. B. "EST" oder "EDT"), da der Name keine Sommerzeitumstellung erzwingt, aber für diesen Zeitpunkt in dieser Zeitzone den korrekten Sommerzeit-Offset verwendet.

    
Jeremy W. Sherman 03.06.2011 17:37
quelle