Есть ли простой способ преобразовать временную метку ISO8601 в форматированный NSDate?

StackOverflow https://stackoverflow.com/questions/2201216

Вопрос

Если я использую следующий код:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];   
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm"];
NSDate *myDate = [dateFormatter dateFromString:@"2010-01-28T15:22:23.863"];
NSLog(@"%@", [dateFormatter stringFromDate:myDate]);

Он успешно преобразован в Date object, однако, похоже, я не могу отформатировать его каким-либо другим способом, кроме yyyy-MM-dd'T'HH:mm, т. е.то, что регистрируется, это 2010-01-28T15:22:23

Если я изменю формат даты, чтобы сказать [dateFormatter setDateFormat:@"yyyy-MMMM-d'T'HH:mm"]; объект Date имеет значение null...

Итак, мой окончательный вопрос заключается в том, как отформатировать временную метку ISO8601 из базы данных SQL для использования, например, NSDateFormatterMediumStyle вернуть "1 января 2010"?

Это было полезно?

Решение

Вам нужен другой форматировщик для обработки выходных данных.Поместите это после вашего кода:

NSDateFormatter *anotherDateFormatter = [[NSDateFormatter alloc] init];   
[anotherDateFormatter setDateStyle:NSDateFormatterLongStyle];
[anotherDateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSLog(@"%@", [anotherDateFormatter stringFromDate:myDate]);

Другие советы

У меня похожая, но немного более сложная проблема, и я нашел очень простое решение!

Проблема: Мои входящие даты ISO8601 выглядят следующим образом: 2006-06-14T11:06:00+02:00 В конце у них есть смещение часового пояса.

Решение: Воспользуйся услугами Питера Хоси ISO8601DateFormatter - форматировщик который вы можете скачать с здесь.

ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSDate *theDate = [formatter dateFromString:dateString];
[formatter release], formatter = nil;

и

ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSString *dateString = [formatter stringFromDate:[twitch dateTwitched]];
[formatter release], formatter = nil;

Вот пример кода от Apple

    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
    NSDate *date = [formatter dateFromString:dateString];

Ссылка:https://developer.apple.com/library/ios/#qa/qa1480/_index.html

Просто упомяну, что начиная с iOS 6.0 вы можете использовать этот формат:

 yyyy-MM-dd'T'HH:mm:ssZZZZZ

У меня есть очень быстрая C-реализация синтаксического анализа ISO8601 NSStrings в NSDates в Одинаковые категории.Вы можете установить его с помощью CocoaPods или просто скопировать файлы в свой проект.

Вот как это использовать:

[NSDate sam_dateFromISO8601String:@"2013-08-24T06:51:21-07:00"]

Он очень надежный и поддерживает отсутствующие часовые пояса и т.д.Нравится мой комментарий выше сказал, что NSDateFormatter был очень медленным для меня при разборе большого количества дат.Переход к этой реализации оказал огромную помощь.

Этот код используется в 6 производственных приложениях (включая Hipstamatic и Рун), над которым я работал без каких-либо известных проблем.Существует набор тестов чтобы предотвратить регрессию.

Короче говоря, я думаю, что это лучший способ разобрать строки ISO8601 в Objective-C.


Вкратце, если вас беспокоит производительность и передача, гораздо предпочтительнее отправлять целые числа вместо строк ISO8601.Вы можете просто преобразовать их в даты с помощью [NSDate dateWithTimeIntervalSince1970:yourInteger].Производительность настолько высока, насколько это возможно, и требуется меньше символов для передачи по проводам.

Я должен отметить, что в прошлый раз, когда я проверял Яблоки NSDate методы не поддерживали ISO8601.У меня все еще есть ошибка с Apple по поводу предоставления официальной поддержки.

+ (id)dateWithNaturalLanguageString:(NSString *)string

будет правильно (когда я запускал его в последний раз) проанализирован и создан NSDate объект из строки ISO801, хотя в документации сказано, что вы не должны его использовать, он работал на всех датах ISO8601, которые я пробовал до сих пор.

Ответ @danielbeard сработал для меня.Однако вам необходимо указать часовой пояс, иначе он преобразует дату UTC в ваш текущий часовой пояс, а это не то, что вы хотите.

- (NSDate *) dateFromISO8601DateString:(NSString *) dateString {
    NSDateFormatter * dateFormatter = [NSDateFormatter new];
    dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    [dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
    NSDate * date = [dateFormatter dateFromString:dateString];
    return date;
}

@Thread captain Попробуйте этот формат :"гггг-ММ-дд'Т'ХХ: мм: сс.ССС"

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top