Достаточно легко получить строку даты ISO 8601 (например, 2004-02-12T15:19:21+00:00
) в PHP через date('c')
, но как получить ее в Objective-C (iPhone)? Есть ли такой же короткий способ сделать это?
Вот долгий путь, который я нашел для этого:
NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";
NSDate *now = [NSDate date];
NSString *formattedDateString = [dateFormatter stringFromDate:now];
NSLog(@"ISO-8601 date: %@", formattedDateString);
// Output: ISO-8601 date: 2013-04-27T13:27:50-0700
Это кажется ужасной чепухой для чего-то столь центрального.
ios
nsdate
nsdateformatter
iso8601
JohnK
источник
источник
Ответы:
Использование
NSDateFormatter
:И в Swift:
источник
setLocale
важно?iOS 10 представляет новый
NSISO8601DateFormatter
класс для обработки именно этого. Если вы используете Swift 3, ваш код будет примерно таким:источник
string
содержит «2016-09-03T21: 47: 27Z».В качестве дополнения к ответу Мэдди формат часового пояса должен быть «ZZZZZ» (5 раз Z) для ISO 8601 вместо одного «Z» (для формата RFC 822). По крайней мере, на iOS 6.
(см. http://www.unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns )
источник
Проблема, о которой часто забывают, заключается в том, что строки в формате ISO 8601 могут иметь миллисекунды, а могут и не иметь.
Другими словами, и «2016-12-31T23: 59: 59.9999999», и «2016-12-01T00: 00: 00» допустимы, но если вы используете средство форматирования даты со статическим типом, один из них не будет проанализирован. ,
Начиная с iOS 10 вы должны использовать
ISO8601DateFormatter
это, обрабатывая все варианты строк даты ISO 8601. См. Пример ниже:Для iOS 9 и ниже используйте следующий подход с несколькими программами форматирования данных.
Я не нашел ответа, который охватил бы оба случая и абстрагировал бы эту тонкую разницу. Вот решение, которое ее устраняет:
Использование:
Я также рекомендую проверить статью Apple о форматерах даты.
источник
Так что используйте категорию Сэма Соффи на NSDate, найденную здесь . С этим кодом, добавленным в ваш проект, вы можете с этого момента использовать единственный метод в NSDate:
Это не только одна строка, но и намного быстрее, чем подход NSDateFormatter, поскольку он написан на чистом C.
источник
От IS8601 проблемы связаны с представлением и часовым поясом
year-month-day time timezone
T
Вот некоторые допустимые строки
Решения
NSDateFormatter
Итак, вот формат, который я использую в onmyway133 ISO8601
Об
Z
идентификаторе Таблица символов поля датыО
locale
форматировании данных с использованием языковых настроекО
en_US_POSIX
технических вопросах и ответах QA1480 NSDateFormatter и Internet DatesИнтересные похожие вопросы
источник
Просто используйте NSISO8601DateFormatter из Foundation framework.
https://developer.apple.com/documentation/foundation/nsiso8601dateformatter?language=objc
источник
Исходя из этого: https://github.com/justinmakaila/NSDate-ISO-8601/blob/master/NSDateISO8601.swift , следующий метод может использоваться для преобразования NSDate в строку даты ISO 8601 в формате yyyy-MM. -dd'T'HH: мм: ss.SSSZ
источник
S
Ключевым моментом здесь было ограничение на долю секундыЭто немного проще и переводит дату в UTC.
источник
Использование Swift 3.0 и iOS 9.0
источник