Jakiego ciągu formatu mam używać dla milisekund w ciągach daty na iPhonie?

100

Jestem zobowiązany do analizowania ciągów w formacie zawierającym milisekundy. Jakiego ciągu formatu należy użyć, aby uzyskać właściwą wartość daty?

Na przykład załóżmy, że mam ciąg o następującej wartości: „2011-06-23T13: 13: 00.000”

Jaki ciąg formatu mam przekazać do mojego NSDateFormatter w poniższym kodzie?

NSString *dateValue = @"2011-06-23T13:13:00.000";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSString *formatString = @"yyyy-MM-dd'T'HH:mm:ss.???";
[formatter setDateFormat:formatString];
NSDate *date = [formatter dateFromString:dateValue];

Czego używam zamiast ??? w powyższym kodzie?

ageektrapped
źródło

Odpowiedzi:

211

To SSS, za w specyfikacji Unicode Locale danych Markup Language .

"yyyy-MM-dd'T'HH:mm:ss.SSS"

Mówiąc bardziej ogólnie, użyj dowolnej liczby wielkich liter S, aby uzyskać tyle miejsc dziesiętnych w składniku ułamkowym sekundy. ( ss.SNa przykład pokaże czas z dokładnością do jednej dziesiątej sekundy).

Simon Whitaker
źródło
2
Zastanawiałem się, czy wiesz, jak mogę zrobić łagodną analizę milisekund? Data może mieć 6, 7 lub nawet nie mieć milisekund. Mógłbym użyć wyrażeń regularnych, ale zastanawiałem się, czy można to zrobić po wyjęciu z pudełka za pomocą odpowiedniego ciągu formatu.
Cyupa
W ten sposób maksymalna liczba S to trzy, np. SSS. Jeśli dodasz więcej, po prostu otrzymasz zera, np. Dla timeIntervalSince1970 z 1415986217.544384 i .SSSSSS otrzymasz .544000, więc nie jest to świetne rozwiązanie.
malhal
@Cyupa Milisekunda to tylko 1/1000 sekundy. 6 miejsc po przecinku to mikrosekundy, a 1 miejsce po przecinku to decisekundy. - Używanie milisekund dla dowolnej liczby miejsc po przecinku jest tak samo błędne, jak używanie dosłownie czegoś w przenośni; nadal możesz to zrobić, ale to zmienia znaczenie tego słowa.
Liggliluff
7

Przewodnik po wzorcach formatu daty sugeruje, że „S” jest specyfikatorem formatu dla ułamków sekund.

Caleb
źródło
4

Na końcu musisz podać tę samą liczbę „S”, na przykład Moja data to „2015-11-17T03: 36: 45.041503Z”, a użyłem „rrrr-MM-dd'T'HH: mm: ss.SSSSSSz” formatter, mam na myśli, że liczba `` S '' wynosi 6 jako 6 cyfr w dacie.

Prakash Raj
źródło
Co zostanie sformatowane, aby uzyskać nanosekundy w mikrosekundach zamiast w milisekundach. Próbowałem z 'yyyy-MM-dd'T'HH: mm: ss.SSSSSSz' i 'yyyy-MM-dd'T'HH: mm: ss.SSSSSSSSSz' i to nie działa.
IndexOutOfDevelopersException
-1

używaj SSSdo trzech miejsc po przecinku sekundy

"yyyy-MM-dd'T'HH:mm:ss.SSS"
harryovers
źródło
To się nie udaje. Nie mam daty wstecz.
ageektrapped