Есть ли простой способ преобразовать временную метку ISO8601 в форматированный NSDate?
-
18-09-2019 - |
Вопрос
Если я использую следующий код:
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 Попробуйте этот формат :"гггг-ММ-дд'Т'ХХ: мм: сс.ССС"