2012-11-30 3 views
5

Ich brauche eine Datumszeichenfolge von einem Server, auf lokale NSDate abgerufen zu konvertieren, sieht die Zeichenfolge wie:NSDateFormatter: Wie konvertiert man den Datums-String mit 'GMT' in das lokale NSDate?

"Fri, 30 Nov 2012 00:35:18 GMT" 

Aber jetzt ist es Freitag, 30. November, 11.36 Uhr ist, so wie konvertiere ich die String zu einem aussagekräftigen lokalen NSDate?

ich gefunden:

iPhone: NSDate convert GMT to local time

Aber sieht aus wie es das Gegenteil der Fall ist.

Antwort

13

Beachten Sie, dass NSDate ist immer das Datum speichern, intern, in GMT. Sie verwenden dann ein Datumsformatierungsprogramm, um eine Zeichenfolge in Ihrer lokalen Zeitzone zu erstellen. In diesem Fall beginnen Sie mit einer Zeichenfolge, daher müssen Sie das Datumsformatierungsprogramm verwenden, um das Datum an erster Stelle zu erstellen, und es dann erneut verwenden, um eine Zeichenfolge in Ihrer lokalen Zeitzone zu erstellen (bei der die Zeitzone nicht verwendet wird) angegeben).

NSString *dateString   = @"Fri, 30 Nov 2012 00:35:18 GMT"; 

NSDateFormatter *dateFormatter = [NSDateFormatter new]; 
dateFormatter.dateFormat  = @"EEE, dd MM yyyy HH:mm:ss zzz"; 

NSDate *date     = [dateFormatter dateFromString:dateString]; 
NSString *localDateString  = [dateFormatter stringFromDate:date]; 

NSLog(@"%@", localDateString); 
// Results: Thu, 29 11 2012 19:35:18 EST 
+0

Hoppla! Ich hatte die falschen Zeds in meiner Antwort. +1. Sie sollten das Gebietsschema dennoch explizit festlegen - andernfalls behält sich 'NSDateFormatter' das Recht vor, Ihre exakte Formatierungszeichenfolge zu ändern. – Tommy

+0

@Tommy: Wenn ich mich nicht irre, wird standardmäßig das Gebietsschema verwendet. Ich habe nur NSLog'dateFormatter.locale.localeIdentifier (ohne es zu setzen) und es gab mir "en_US", das ist mein derzeitiges Gebietsschema. Deshalb habe ich es nicht eingestellt, weil er es in seiner lokalen Zeitzone wollte. – lnafziger

+0

@lnafziger Locale und Zeitzone sind unabhängige Eigenschaften. Die Verwendung des Gebietsschemas 'en_US_POSIX' ist wichtig, wenn Sie mit Datum/Uhrzeit-Strings im festen Format arbeiten. Ohne es ist es möglich, dass das Format hinter Ihrem Rücken geändert wird, basierend auf Dingen wie der 24-Stunden-Einstellung des Benutzers (als ein Beispiel). Das Festlegen der Ländereinstellung hat keine Auswirkungen auf die Zeitzone des Formats. Sehen Sie sich die QA1480 an, auf die @Tommy in seiner Antwort verwiesen hat. – rmaddy

1

Verwenden Sie einfach NSDateFormatter mit der Formatierungszeichenfolge eee, dd MMM yyyy HH:mm:ss zzz. Die Zs am Ende bewirken, dass die Zeitzone von der Zeichenfolge gelesen wird. So

, gegeben QA1480, Beispielcode:

NSLocale *usLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]; 
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease]; 
[formatter setLocale:usLocale]; 
[formatter setDateFormat:@"eee, dd MMM yyyy HH:mm:ss zzz"]; 
_createdAt = [formatter dateFromString:dateString]; 
+0

In dem Link in meiner Frage, benutzte er 'NSTimeZone * gmt = [NSTimeZone timeZoneWithAbbreviation: @ "GMT"]; [dateFormatter setTimeZone: gmt]; 'warum brauchst du das nicht? – hzxu

+0

Sie brauchen das nicht, weil Ihre Zeichenfolge GMT darin angibt und die 'zzz'-Komponente des von Ihnen festgelegten Datumsformats' NSDateFormatter' angewiesen wird, das zu verwenden, was Ihre Zeichenkette spezifiziert, und nicht, was immer es als Norm betrachtet. – Tommy