2017-01-28 22 views
13

Witam Mam słownikaiOS Swift 3: Konwersja "yyyy-MM-dd'T'GG: mm: SSZ" format string do obiektu Date

self.publishedAt = dictionary["publishedAt"] as? NSString 

w którym jestem datę "2017 coraz -01-27T18: 36: 36Z ". Chcę przekonwertować go w czytelnym formacie: dd-MM-rrrr gg: mm: ss. Próbowałem przez

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "dd-MM-yyyy hh:mm:ss" 
let date = dateFormatter.date(from: (self.publishedAt as? String)!) 
print("EXACT_DATE : \(date)") 

Ale uzyskanie zerowej. :(

Jaki jest prawidłowy sposób, aby uzyskać datę w prostym formacie

+0

Potrzebujesz ** formatu ** do konwertowania ciągu ISO8601 do daty i formatu ** wyjścia **, aby przekonwertować datę z powrotem na ciąg znaków, zobacz także http://stackoverflow.com/questions/33277970/how -to-convert-string-to-date-to-string-in-swift-ios? rq = 1, I nie używaj 'NSString' w Swift. – vadian

Odpowiedz

30

Trzeba format wejściowy do konwersji ISO8601 ciąg daty i format wyjściowy do konwersji sięgają wyrażenie:?

let string = "2017-01-27T18:36:36Z" 

let dateFormatter = DateFormatter() 
let tempLocale = dateFormatter.locale // save locale temporarily 
dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX 
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" 
let date = dateFormatter.date(from: string)! 
dateFormatter.dateFormat = "dd-MM-yyyy HH:mm:ss" 
dateFormatter.locale = tempLocale // reset the locale 
let dateString = dateFormatter.string(from: date) 
print("EXACT_DATE : \(dateString)") 
+0

@vadian: Wielkie dzięki –

+0

@vadian Dlaczego zresetowałeś ustawienia narodowe? – user1960169

+0

@ user1960169 Jak wspomniano w odpowiedzi Rob'a, przeczytaj [Apple Technical Q & A 1480] (https://developer.apple.com/library/content/qa/qa1480/_index.html) – vadian

13

aby przekonwertować ciąg Date obiektu:

let string = "2017-01-27T18:36:36Z" 
let isoFormatter = ISO8601DateFormatter() 
let date = isoFormatter.date(from: string)! 

Lub, jeśli trzeba wspierać iOS wersje, które wyprzedzają ISO8601DateFormatter:

let isoFormatter = DateFormatter() 
isoFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" 
isoFormatter.locale = Locale(identifier: "en_US_POSIX") 
let date = isoFormatter.date(from: string)! 

(Aby zrozumieć dlaczego ustawiamy locale dla ISO 8601 data formater, zobacz Apple Technical Q&A 1480.)

Następnie, aby przekonwertować do formatu daty w obsłudze, można użyć osobnego formatowania (lub użyć drugim przykładzie powyżej, można ponownie użyć formatowania, ale należy pamiętać, aby zresetować locale powrót do Locale.current):

let formatter = DateFormatter() 
formatter.dateStyle = .short 
formatter.timeStyle = .medium 
let result = formatter.string(from:date) 

Uwaga, polecam korzystania z tych parametrów stylu prezentując datę powrotem do użytkownika, a nie do dateFormat ciąg znaków, więc używa stylów odpowiednich dla ich lokalizacji, zamiast zakładać, że chcą zegara 24-godzinnego i/lub czy używają formatu dd-MM-yyyy vs MM-dd-yyyy.


Uwaga, zmiana formatów nieaktualne formater (np zmieniając ciąg dateFormat) jest stosunkowo kosztowny proces, więc jeśli jesteś wykonywania tego procesu dla wielu dat, nie należy przyjmować jedną DateFormatter i stale zmienia swój dateFormat lub style powtarzające się w tę iz powrotem (lub, co gorsza, tworzenie nowych formaterów dla każdej daty). Zamiast tego utwórz jeden formatter według stylu formatu daty i używaj go ponownie w jak największym stopniu.

+0

Wielkie dzięki :) Ostatnia rzecz: jak czy mogę ustawić na moją strefę czasową? –

+1

Ten drugi formater domyślnie wygeneruje ten przyjazny dla użytkownika ciąg w strefie czasowej. Możesz ustawić "strefę czasową" formatyzatora, ale musisz to zrobić tylko wtedy, gdy tworzony ciąg nie jest twoją istniejącą strefą czasową. – Rob

+0

thanx thanx alot :) –