Подтвердить что ты не робот

Преобразование ISO 8601 в NSDate

У меня есть временная метка, исходящая от сервера, которая выглядит так:

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

Я попытался удалить двоеточие, я пробовал все это:

Преобразование метки времени ISO 8601 в NSDate: как вы работаете со смещением по времени UTC?

Почему NSDateFormatter не может анализировать дату из формата ISO 8601

Вот где я нахожусь:

+ (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];
}

Один из моих самых больших вопросов - это формат даты, который у меня выше, действительно ISO 8601? Все примеры, которые я видел от людей, форматы каждого из них несколько отличаются. У некоторых есть ...157-0000, у других нет ничего в конце.

4b9b3361

Ответ 1

Это работает для меня:

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);

Ответ 2

Появился новый API от Apple! NSISO8601DateFormatter

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

Ответ 3

У меня также есть собственный API, который является чистым... Это реализация, которую я получил в моем классе DateTimeManager:

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

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

Просто скопируйте и вставьте метод, это будет трюк. Наслаждайтесь этим!