Есть ли простой способ конвертировать метку времени 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 года"?
Ответы
Ответ 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"