2011-10-28 17 views
16

Eventuali duplicati:
Converting an ISO 8601 timestamp into an NSDate: How does one deal with the UTC time offset?Perché NSDateFormatter non può analizzare data dalla norma ISO 8601

Io uso rotaie come back-end, l'uscita data di default è 2008-12-29T00: 27: 42-08: 00

Ma dopo la mia ricerca NSDateFormatter non può sostenere, se non a cambiare la data fuori a 2008-12-29T00: 27: 42-0800

.515.053.691,36321 milioni

Ecco il codice che ho usato per analizzare ISO 8601 ad oggi, ma non è un lavoro

NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; 
NSLog(@"%@", [dateFormatter dateFromString:@"2008-12-29T00:27:42-08:00"]); 

Tutte le idee?

+0

@Ryan Conosce questo collegamento, voglio solo ottenere una soluzione migliore. – allenwei

+0

Hai trovato una soluzione per questo? Sto cercando una soluzione in grado di fornire NSDate o NSString per una data formattata come "2008-12-29T00: 27: 42-08: 00". La risposta accettata non funziona per me. La parte problematica è timezone, ad esempio "-08: 00". – Mustafa

risposta

48

Il problema è con il fuso orario alla fine.

È necessario averlo come: GMT-0X: 00 o come -0X00 senza separare tra ore e minuti.

le seguenti due combinazioni funzionano:

Combo 1 - utilizzare il formato GMT (GMT-0X: 00) e ZZZZ

NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZ"]; 
NSLog(@"DATE FORMAT:%@", [dateFormatter dateFromString:@"2008-12-29T00:27:42GMT-08:00"]); 

Combo 2 - utilizzo RFC 822 formato (-0X00) e ZZZ

dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"]; 
NSLog(@"DATE FORMAT:%@", [dateFormatter dateFromString:@"2008-12-29T00:27:42-0800"]); 
+1

Secondo http://www.w3.org/TR/NOTE-datetime 2008-12-29T00: 27: 42-08: 00 è un formato data valido. Posso cambiare il formato predefinito dal back-end di Rails, ma penso che non sia una buona soluzione. – allenwei

+0

Ho provato la seconda soluzione ma c'è un errore di fuso orario con il fuso orario: "FORMATO DATA: 2008-12-29 08:27:42 +0000". "-0800" trasformato in "+0000" – JastinBall

+1

restituisce nulla se utilizzato con 2008-12-29T00: 27: 42Z e questo è anche ISO8601 http://en.wikipedia.org/wiki/ISO_8601 – AmineG

Problemi correlati