2013-07-09 24 views
28

Mam timestamp pochodzących z serwera, który wygląda tak:Konwersja ISO 8601 do NSDate

2013-04-18T08:49:58.157+0000 

Próbowałem usunięcie dwukropek, próbowałem wszystkie z nich:

Converting an ISO 8601 timestamp into an NSDate: How does one deal with the UTC time offset?

Why NSDateFormatter can not parse date from ISO 8601 format

Oto gdzie jestem:

+ (NSDate *)dateUsingStringFromAPI:(NSString *)dateString { 


    NSDateFormatter *dateFormatter; 
    dateFormatter = [[NSDateFormatter alloc] init]; 

    //@"yyyy-MM-dd'T'HH:mm:ss'Z'" - doesn't work 
    //@"yyyy-MM-dd'T'HH:mm:ssZZZ" - doesn't work 
    //@"yyyy-MM-dd'T'HH:mm:sss" - doesn't work 

    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"]; 
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; 

    // NSDateFormatter does not like ISO 8601 so strip the milliseconds and timezone 
    dateString = [dateString substringWithRange:NSMakeRange(0, [dateString length]-5)]; 

    return [dateFormatter dateFromString:dateString]; 
} 

Jednym z moich największych pytań jest format daty, który mam powyżej ISO 8601? Wszystkie przykłady, które widziałem od ludzi, formaty każdego z nich są nieco inne. Niektórzy mają ...157-0000, inni nie mają niczego na końcu.

+0

Potrzebujesz 'yyyy-MM-dd'T'HH: mm: ss.sssZ'. – rmaddy

+0

Bez kostki, próbowałem nawet usunąć linię, aby usunąć 5 ostatnich znaków. – random

+4

Przepraszam, zrobiłem literówkę - powinno to być "rrrr-MM-dd'T'HH: mm: ss.SSSZ". Nie przycinaj struny i nie ustawiaj strefy czasowej. – rmaddy

Odpowiedz

58

Działa to dla mnie:

NSString *dateString = @"2013-04-18T08:49:58.157+0000"; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"]; 
// Always use this locale when parsing fixed format date strings 
NSLocale *posix = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 
[formatter setLocale:posix]; 
NSDate *date = [formatter dateFromString:dateString]; 
NSLog(@"date = %@", date); 
+0

To się udało! Dziękuję bardzo za pomoc – random

+0

kopalnia faktycznie działała dobrze bez ustawiania ustawień regionalnych. – random

+1

Tak, może działać bez ustawień regionalnych, ale w niektórych przypadkach (różne ustawienia użytkownika) nie. Aby mieć pewność, że Twój kod będzie zawsze działał, ustaw locale na specjalne ustawienia locix. – rmaddy

12

Jest nowe API od Apple! NSISO8601DateFormatter

NSString *dateSTR = @"2005-06-27T21:00:00Z"; 
NSISO8601DateFormatter *formatter = [[NSISO8601DateFormatter alloc] init]; 
NSDate *date = [formatter dateFromString:dateSTR]; 
NSLog(@"%@", date); 
+2

Wygląda na to, że nie zarządza milisekundami. – Lubbo

+0

Re: milliseconds: http://www.openradar.me/29609526 –

2

Mam też natywne API, które jest sposobem czystsze ... To realizacja mam w mojej klasie DateTimeManager:

+ (NSDate *)getDateFromISO8601:(NSString *)strDate{ 

    NSISO8601DateFormatter *formatter = [[NSISO8601DateFormatter alloc] init]; 
    NSDate *date = [formatter dateFromString: strDate]; 
    return date; 
} 

wystarczy skopiować i wkleić ten sposób, by to zrobić sztuczka. Ciesz się!

Powiązane problemy