Способ анализа дат RFC 3339 / ISO 8601 заключается в следующем:
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZZZZZ";
formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
Или в macOS 10.12 и iOS 10:
NSISO8601DateFormatter *formatter = [[NSISO8601DateFormatter alloc] init];
Тогда:
NSDate* date = [formatter dateFromString:dateString];
Обратите внимание, что ZZZZZ
указывает форматировщику использовать часовой пояс, представленный в строке (где GMT + 0 представляется как Z
) при преобразовании строк в NSDate
объекты.Аналогично, устанавливая dateFormat
и timeZone
, этот форматер также можно использовать для преобразования NSDate
объектов обратно в строки, такие как 2011-08-24T14:06:10Z
, выполняя необходимые преобразования часовых поясов.В итоге этот форматер работает в обоих направлениях.
Использование свойства locale
также является наилучшей практикой, так как оно гарантирует, что дата будет правильно интерпретироваться независимо от конкретного календаря устройства (т. Е. Особенно если это не так.григорианский календарь).См. Технические вопросы и ответы 1480 .