2017-01-25 50 views
6

Próbuję analizować tenISO8601DateFormatter nie analizuje daty ISO ciąg

2017-01-23T10: 12: 31.484Z

stosując natywną ISO8601DateFormatter klasę świadczonych przez iOS 10 ale nie zawsze . Jeśli ciąg nie zawiera milisekund, obiekt Date jest tworzony bez problemów.

ja próbowałem tego i wielu options kombinację ale nie zawsze ...

let formatter = ISO8601DateFormatter() 
formatter.timeZone = TimeZone(secondsFromGMT: 0) 
formatter.formatOptions = [.withInternetDateTime, .withDashSeparatorInDate, .withColonSeparatorInTime, .withColonSeparatorInTimeZone, .withFullTime] 

Każdy pomysł? Dzięki!

+1

zobaczyć to raz http: // stackoverflow. com/questions/28016578/swift-how-to-create-a-date-time-stamp-and-format-as-iso-8601-rfc-3339-utc-tim/28016619 –

+0

Tak, wiem, że używając 'dateFormat 'jest sposobem, ale chcę użyć rodzimej klasy systemu iOS 10 ... :( – mhergon

Odpowiedz

12

ISO8601DateFormatter nie obsługuje ciągów znaków, w tym milisekund.

Obejście polega na usunięciu części milisekundy wyrażeniem regularnym.

let isoDateString = "2017-01-23T10:12:31.484Z" 
let trimmedIsoString = isoDateString.replacingOccurrences(of: "\\.\\d+", with: "", options: .regularExpression) 
let formatter = ISO8601DateFormatter() 
let date = formatter.date(from: trimmedIsoString) 

Edit: W MacOS 10.13+/iOS 11+ nowa opcja zostanie dodana do wspierania ułamków sekund:

static var withFractionalSeconds: ISO8601DateFormatter.Options { get }

+0

Kiedy to dodano? Złożyłem radar około 3 tygodnie temu, ponieważ nie miał ułamkowych sekund. Wydaje się, że nadal nie pozwala na wybór liczby miejsc po przecinku :(http://openradar.appspot.com/radar?id=6095965782016000 – Fogmeister

+0

Został dodany za pomocą [macOS 10.13/iOS 11 SDK] (https: //developer.apple.com/documentation/foundation/iso8601dateformatter.options/2923300-withfractionalseconds) – vadian

+0

Nie, tak naprawdę nie było.To tam nie było 3 tygodnie temu. Musiał zostać dodany bardzo niedawno. 11.0, ale to musiało być dodane w ciągu ostatnich kilku dni, pokazałem nawet koledze, że nie było go tam w zeszłym tygodniu. :) – Fogmeister