Łatwo jest pobrać ciąg daty ISO 8601 (na przykład 2004-02-12T15:19:21+00:00
) w PHP za pośrednictwem date('c')
, ale jak można go uzyskać w Objective-C (iPhone)? Czy można to zrobić w podobny sposób?
Oto długa droga, jaką udało mi się zrobić:
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
Wydaje się, że to strasznie dużo bzdury jak na coś tak ważnego.
ios
nsdate
nsdateformatter
iso8601
John K.
źródło
źródło
Odpowiedzi:
Zastosowanie
NSDateFormatter
:A w Swift:
źródło
setLocale
ważne?iOS 10 wprowadza nową
NSISO8601DateFormatter
klasę, która obsługuje właśnie to. Jeśli używasz Swift 3, Twój kod będzie wyglądał mniej więcej tak:źródło
string
zawiera „2016-09-03T21: 47: 27Z”.Jako uzupełnienie odpowiedzi maddy'ego, format strefy czasowej powinien mieć format „ZZZZZ” (5 razy Z) dla ISO 8601 zamiast pojedynczego „Z” (który jest dla formatu RFC 822). Przynajmniej na iOS 6.
(patrz http://www.unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns )
źródło
Często pomijanym problemem jest to, że ciągi znaków w formacie ISO 8601 mogą mieć milisekundy, a mogą nie.
Innymi słowy, zarówno „2016-12-31T23: 59: 59.9999999”, jak i „2016-12-01T00: 00: 00” są prawidłowe, ale jeśli używasz programu formatującego datę wpisywanego statycznie, jeden z nich nie zostanie przeanalizowany .
Począwszy od iOS 10 , powinieneś używać
ISO8601DateFormatter
tego, który obsługuje wszystkie odmiany ciągów daty ISO 8601. Zobacz przykład poniżej:W przypadku systemu iOS 9 i starszych użyj następującego podejścia z wieloma elementami formatującymi dane.
Nie znalazłem odpowiedzi, która obejmowałaby oba przypadki i ukazywałaby tę subtelną różnicę. Oto rozwiązanie, które to rozwiązuje:
Stosowanie:
Polecam też sprawdzić artykułem Apple o formatach daty.
źródło
Skorzystaj więc z kategorii Sama Soffee w NSDate, którą znajdziesz tutaj . Po dodaniu tego kodu do projektu możesz odtąd używać jednej metody w NSDate:
Nie tylko jest to jedna linia, ale jest znacznie szybsza niż podejście NSDateFormatter, ponieważ jest napisane w czystym C.
źródło
Od IS8601 problemy dotyczą reprezentacji i strefy czasowej
year-month-day time timezone
T
Oto kilka prawidłowych ciągów
Rozwiązania
NSDateFormatter
Oto format, którego używam w onmyway133 ISO8601
Informacje o
Z
identyfikatorze Tabela symboli pola datyInformacje o
locale
formatowaniu danych przy użyciu ustawień regionalnychInformacje
en_US_POSIX
techniczne Pytania i odpowiedzi QA1480 NSDateFormatter i daty internetoweCiekawe pytania pokrewne
źródło
Po prostu użyj NSISO8601DateFormatter z frameworka Foundation.
https://developer.apple.com/documentation/foundation/nsiso8601dateformatter?language=objc
źródło
Na podstawie tego sedna: https://github.com/justinmakaila/NSDate-ISO-8601/blob/master/NSDateISO8601.swift można użyć następującej metody do konwersji NSDate na ciąg daty ISO 8601 w formacie rrrr-MM -dd'T'HH: mm: ss.SSSZ
źródło
S
Kluczowy był limit na sekundęJest to trochę prostsze i umieszcza datę w UTC.
źródło
Korzystanie ze Swift 3.0 i iOS 9.0
źródło