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

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

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

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, однако я не могу его форматировать иначе, чем yyyy-MM-dd'T'HH:mm, то есть то, что регистрируется, 2010-01-28T15:22:23

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Решение: Используйте Peter Hosey 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;

Ответ 3

Вот пример кода из 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

Ответ 4

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

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

Ответ 5

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

Здесь, как его использовать:

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

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

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

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


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

Ответ 6

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

+ (id)dateWithNaturalLanguageString:(NSString *)string

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

Ответ 7

Ответ на @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;
}

Ответ 8

@Капитан капитана Попробуйте этот формат: "yyyy-MM-dd'T'HH: mm: ss.SSS"