2012-11-30 9 views

risposta

13

noti che NSDate del negozio sempre la data, internamente, in GMT. Quindi si utilizza un programma di formattazione della data per creare una stringa nel fuso orario locale. In questo caso, si inizia con una stringa, quindi è necessario utilizzare il programma di formattazione della data per creare la data in primo luogo, quindi utilizzarla nuovamente per creare una stringa nel fuso orario locale (che viene impostato automaticamente quando il fuso orario non è specificato).

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

Oops; Ho avuto le frecce sbagliate nella mia risposta. +1. Sebbene sia comunque necessario impostare le impostazioni in modo esplicito, altrimenti "NSDateFormatter" si riserva il diritto di modificare la stringa di formattazione esatta. – Tommy

+0

@Tommy: Se non sbaglio, le impostazioni internazionali sono predefinite come impostazioni internazionali correnti. Ho appena installato NSLog dataFormatter.locale.localeIdentifier (senza impostarlo) e mi ha dato "en_US", che è il mio locale corrente. Ecco perché non l'ho impostato, perché lo voleva nel fuso orario locale. – lnafziger

+0

@lnafziger locale e fuso orario sono proprietà indipendenti. L'uso delle impostazioni locali 'en_US_POSIX' è importante quando si lavora con stringhe data/ora a formato fisso. Senza di esso, è possibile che il formato venga modificato dietro la schiena in base a cose come l'impostazione 24 ore dell'utente (come un esempio). L'impostazione delle impostazioni internazionali non ha alcun effetto sul fuso orario del formato. Vedi il QA1480 a cui @Tommy fa riferimento nella sua risposta. – rmaddy

1

Basta usare NSDateFormatter con la stringa di formattazione eee, dd MMM yyyy HH:mm:ss zzz. Alla fine Z fa leggere il fuso orario dalla stringa. Codice

Quindi, data QA1480, campione:

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

Nel collegamento nella mia domanda, ha usato 'NSTimeZone * gmt = [NSTimeZone timeZoneWithAbbreviazione: @" GMT "]; [dateFormatter setTimeZone: gmt]; 'perché non ti serve questo? – hzxu

+0

Non ne hai bisogno perché la tua stringa specifica GMT e il componente 'zzz' del formato data che hai impostato dirà a' NSDateFormatter' di usare quello che specifica la tua stringa piuttosto che qualsiasi cosa consideri la norma. – Tommy

Problemi correlati