Преобразование 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
, у других нет ничего в конце.
Ответы
Ответ 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;
}
Просто скопируйте и вставьте метод, это будет трюк. Наслаждайтесь этим!