Jako zasób towarzyszący dla wszystkich poniższych odpowiedzi, zdecydowanie polecam sprawdzenie nsdateformatter.com
user3344977
Stare odpowiedzi tutaj są naprawdę ŹLE . Dokument Apple mówi krystalicznie czyste, że musisz buforować formatyzator. stackoverflow.com/a/42370648/294884
let dateFormatter =NSDateFormatter()
dateFormatter.dateFormat =/* find out and place date format from
* http://userguide.icu-project.org/formatparse/datetime
*/let date = dateFormatter.dateFromString(/* your_date_string */)
let dateFormatter =DateFormatter()
dateFormatter.dateFormat =/* date_format_you_want_in_string from
* http://userguide.icu-project.org/formatparse/datetime
*/guardlet date = dateFormatter.date(from:/* your_date_string */)else{
fatalError("ERROR: Date conversion failed due to mismatched format.")}// use date constant here
Znalazłem rozwiązanie wystarczy ustawić „rrrr-MM-dd gg: mm: ss.SSSSxxx” ten format daty
Shardul
1
Mam ciąg daty taki jak ten „2014-07-15 06: 55: 14-0400” i próbowałem użyć yyyy-MM-dd hh:mm:ssZZZ. Ale nie mogę pobrać obiektu daty z ciągu.
iamprem,
2
@Prem, jeśli zobaczysz, że wynik jest "2014-07-15 10:55:14 +0000"prawidłowy. Począwszy od NSDateopisu, wynik daty byłby obliczany z różnicą (tutaj GMT -4 godziny). Jeśli chcesz uzyskać różnicę między GMT a UTC, -0400sprawdź to odniesienie
x4h1d
@ x4h1d, Hej, mam to! Popełniłem błąd, w hhktórym powinno być HH. Dzięki!
iamprem,
3
@ lmiguelvargasf, myślę, że tak będzie yyyy-MM-dd'T'HH:mm:ss.SSS'Z'. Zakładam, że Zjest tu tylko postacią. Pamiętaj, że Zma również specjalne znaczenie. Jeśli chcesz Zokreślić jako, basic hmsformat będzie yyyy-MM-dd'T'HH:mm:ss.SSSZ.
x4h1d
71
Szybki 4
importFoundationlet dateString ="2014-07-15"// change to your date format
var dateFormatter =DateFormatter()
dateFormatter.dateFormat ="yyyy-MM-dd"let date = dateFormatter.date(from: dateString)
println(date)
Szybki 3
importFoundationvar dateString ="2014-07-15"// change to your date format
var dateFormatter =NSDateFormatter()
dateFormatter.dateFormat ="yyyy-MM-dd"var date = dateFormatter.dateFromString(dateString)
println(date)
Kod jest nieprawidłowy. Wydaje „15 stycznia 2014, 12:00”
Jake Lin
5
użycie ddzamiast DDpowinno pomóc rozwiązać problem „zawsze w styczniu”.
Pascal Belloncle,
1
Prawidłowa wersja jest, yyyy-MM-ddw przeciwnym razie przeanalizowana data utknęła w styczniu - zaktualizowałem odpowiedź, aby odzwierciedlić zmianę.
Zorayr
Co jeśli chcę przekazać bieżącą datę jako ciąg. Czy to zadziała?
Arjun Kalidas
@Zorayr, Kittisak: Dostaję out out, opcjonalne (2014-07-14 18:30:00 +0000), co oznacza, że jeden dzień jest pomniejszony. Jak mogę to naprawić?
Vineesh TP,
54
func convertDateFormatter(date:String)->String{let dateFormatter =NSDateFormatter()
dateFormatter.dateFormat ="yyyy-MM-dd'T'HH:mm:ss.SSSZ"//this your string date format
dateFormatter.timeZone =NSTimeZone(name:"UTC")let date = dateFormatter.dateFromString(date)
dateFormatter.dateFormat ="yyyy MMM EEEE HH:mm"///this is what you want to convert format
dateFormatter.timeZone =NSTimeZone(name:"UTC")let timeStamp = dateFormatter.stringFromDate(date!)return timeStamp
}
Zaktualizowano dla Swift 3.
func convertDateFormatter(date:String)->String{let dateFormatter =DateFormatter()
dateFormatter.dateFormat ="yyyy-MM-dd'T'HH:mm:ss.SSSZ"//this your string date format
dateFormatter.timeZone =NSTimeZone(name:"UTC")asTimeZone!let date = dateFormatter.date(from: date)
dateFormatter.dateFormat ="yyyy MMM EEEE HH:mm"///this is what you want to convert format
dateFormatter.timeZone =NSTimeZone(name:"UTC")asTimeZone!let timeStamp = dateFormatter.string(from: date!)return timeStamp
}
Jeśli będziesz musiał często parsować ciąg znaków w dacie, możesz przenieść funkcjonalność do rozszerzenia. Utworzyłem plik sharedCode.swift i umieściłem tam moje rozszerzenia:
extensionString{func toDateTime()->NSDate{//Create Date Formatter
let dateFormatter =NSDateFormatter()//Specify Format of String to Parse
dateFormatter.dateFormat ="yyyy-MM-dd hh:mm:ss.SSSSxxx"//Parse into NSDate
let dateFromString :NSDate= dateFormatter.dateFromString(self)!//Return Parsed Date
return dateFromString
}}
Następnie, jeśli chcesz przekonwertować swój ciąg na NSDate, możesz po prostu napisać coś takiego:
Dzięki. Możliwe jest również, choć mniej przydatne, pisanie: var myDate = "04-05-2015" .toDateTime () Znalazłem to przydatne podczas konfigurowania danych testowych.
Stephen Watson,
1
Jestem prawie pewien, że tak hhpowinno być HH.
Alex
Nie daje mi to w podanym przeze mnie formacie: var date = NSDate (); let dateFormatter = NSDateFormatter (); dateFormatter.dateFormat = "MMMM d, RRRR"; let myDate = dateFormatter.stringFromDate (date); I na dodatek, jeśli użyję twojego rozszerzenia w ten sposób -> var myDate2 = myDate.toDateTime (); Daje mi zupełnie inną datę, a nie aktualną.
Nie trzeba pozostawiać ich w zasięgu globalnym. Możesz rozszerzyć Formatter po prostu zadeklarować swoje właściwości jako statyczne. sprawdź ten stackoverflow.com/a/43658213/2303865
Leo Dabus
4
Rozszerzenia wsparcia Swift, z rozszerzeniem można dodać nowe funkcje do istniejącej class, structure, enumerationlub protocoltypu.
Możesz dodać nową initfunkcję do NSDateobiektu, rozszerzając obiekt za pomocą extensionsłowa kluczowego.
Lubię sposób inicjacji. Czy nie ma innego sposobu na utworzenie daty bez użycia timeInterval? co jeśli nsdate przestanie mieć inicjalizator z parametrem daty? jak byś to rozwiązał? Osobiście wolę sposób inicjacji, ale nie wiem, jak rozwiązać ten problem
Mijail
Mam problem: moja data jako ciąg znaków jest taka: „2017-03-10 22:16:00 +0000” i użyłem tego formatu: „rrrr-MM-dd gg: mm: ss Z” i ten: „rrrr-MM-dd'T'HH: mm: ss”. Ale dla obu, gdy to zrobię: let beginDate = df.date(from: beginDateString), dostaję zero! czemu? ( df = DateFormatter())
Paul Bénéteau,
4
Od Swift 3 wiele prefiksów NS zostało usuniętych.
let dateFormatter =DateFormatter()
dateFormatter.dateFormat ="yyyy-MM-dd'T'HH:mm:ss.SSSZ"/* date format string rules
* http://userguide.icu-project.org/formatparse/datetime
*/let date = dateFormatter.date(from: dateString)
Mam problem: moja data jako ciąg znaków jest taka: „2017-03-10 22:16:00 +0000” i użyłem tego formatu: „rrrr-MM-dd gg: mm: ss Z” i ten: „rrrr-MM-dd'T'HH: mm: ss”. Ale dla obu, gdy to zrobię: let beginDate = df.date(from: beginDateString), dostaję zero! czemu? ( df = DateFormatter())
Paul Bénéteau,
4
Swift 3,4:
2 przydatne konwersje:
string(from:Date)// to convert from Date to a String
date(from:String)// to convert from String to Date
Zastosowanie: 1.
let date =Date()//gives today's date
let dateFormatter =DateFormatter()
dateFormatter.dateFormat ="dd.MM.yyyy"let todaysDateInUKFormat = dateFormatter.string(from: date)
2)
let someDateInString ="23.06.2017"var getDateFromString = dateFormatter.date(from: someDateInString)
Swift:iOSif we have string, convert it to NSDate,var dataString = profileValue["dob"]asStringvar dateFormatter =NSDateFormatter()
dateFormatter.dateFormat ="MM-dd-yyyy"// convert string into date
let dateValue:NSDate?= dateFormatter.dateFromString(dataString)if you have and date picker parse date like this
// to avoid any nil value
iflet isDate = dateValue {self.datePicker.date = isDate
}
let dateFormatter =DateFormatter()
dateFormatter.dateFormat ="dd/MM/yyyy"//same as strDate date formator
dateFormatter.timeZone =TimeZone(abbreviation:"GMT+0:00")//Must used if you get one day less in conversion
let convertedDateObject = dateFormatter.date(from: strDate)
importFoundationlet now :String="2014-07-16 03:03:34 PDT"var date :NSDatevar dateFormatter :NSDateFormatter
date = dateFormatter.dateFromString(now)
date // $R6:__NSDate =2014-07-1603:03:34 PDT
Odpowiedzi:
Spróbuj tego:
Aby uzyskać dalsze zapytanie, sprawdź klasy NSDateFormatter i DateFormatter w Framework Foundation odpowiednio dla Objective-C i Swift.
Swift 3 i nowszy (w tym Swift 4)
źródło
yyyy-MM-dd hh:mm:ssZZZ
. Ale nie mogę pobrać obiektu daty z ciągu."2014-07-15 10:55:14 +0000"
prawidłowy. Począwszy odNSDate
opisu, wynik daty byłby obliczany z różnicą (tutaj GMT -4 godziny). Jeśli chcesz uzyskać różnicę między GMT a UTC,-0400
sprawdź to odniesieniehh
którym powinno byćHH
. Dzięki!yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
. Zakładam, żeZ
jest tu tylko postacią. Pamiętaj, żeZ
ma również specjalne znaczenie. Jeśli chceszZ
określić jako,basic hms
format będzieyyyy-MM-dd'T'HH:mm:ss.SSSZ
.Szybki 4
Szybki 3
Mogę to zrobić za pomocą tego kodu.
źródło
dd
zamiastDD
powinno pomóc rozwiązać problem „zawsze w styczniu”.yyyy-MM-dd
w przeciwnym razie przeanalizowana data utknęła w styczniu - zaktualizowałem odpowiedź, aby odzwierciedlić zmianę.Zaktualizowano dla Swift 3.
źródło
Detale
Rozwiązanie
Stosowanie
Wynik
Więcej informacji
Informacje o formacie daty
źródło
Jeśli będziesz musiał często parsować ciąg znaków w dacie, możesz przenieść funkcjonalność do rozszerzenia. Utworzyłem plik sharedCode.swift i umieściłem tam moje rozszerzenia:
Następnie, jeśli chcesz przekonwertować swój ciąg na NSDate, możesz po prostu napisać coś takiego:
źródło
hh
powinno byćHH
.Dla Swift 3
źródło
Fragmenty kodu na tej stronie kontroli jakości są „do góry nogami” ...
Pierwszą rzeczą, o której wspomina Apple, jest buforowanie formatera w pamięci podręcznej ...
Link do Apple doco określający dokładnie, jak to zrobić:
Użyj globalnego ...
Następnie użyj tego formatyzatora w dowolnym miejscu ...
lub
Lub użyj dowolnej z wielu innych, wielu wygodnych metod w DateFormatter.
To takie proste.
(Jeśli napiszesz rozszerzenie w String, twój kod jest całkowicie „do góry nogami” - nie możesz używać żadnych wywołań dateFormatter!)
Zauważ, że zwykle będziesz mieć kilka takich globali .. takich jak „formatForClient” „formatForPubNub” „formatForDisplayOnInvoiceScreen” .. itp.
źródło
Rozszerzenia wsparcia Swift, z rozszerzeniem można dodać nowe funkcje do istniejącej
class
,structure
,enumeration
lubprotocol
typu.Możesz dodać nową
init
funkcję doNSDate
obiektu, rozszerzając obiekt za pomocąextension
słowa kluczowego.Teraz możesz zainicjować obiekt NSDate za pomocą:
źródło
df.date(from: beginDateString)
, dostaję zero! czemu? (df = DateFormatter()
)Od Swift 3 wiele prefiksów NS zostało usuniętych.
źródło
df.date(from: beginDateString)
, dostaję zero! czemu? (df = DateFormatter()
)Swift 3,4:
2 przydatne konwersje:
Zastosowanie: 1.
2)
źródło
DLA SWIFT 3.1
UWAGA: TO BĘDZIE ZWRÓCIĆ ORYGINALNY STRING JEŚLI BŁĄD
źródło
Aby dodać ciąg znaków w formacie daty w Swift, zrobiłem to
źródło
Ta praca dla mnie ..
źródło
Poniżej znajduje się kilka opcji konwersji formatu ciągów na datę w szybkim iOS.
Thursday, Dec 27, 2018
format =EEEE, MMM d, yyyy
12/27/2018
format =MM/dd/yyyy
12-27-2018 09:59
format =MM-dd-yyyy HH:mm
Dec 27, 9:59 AM
format =MMM d, h:mm a
December 2018
format =MMMM yyyy
Dec 27, 2018
format =MMM d, yyyy
Thu, 27 Dec 2018 09:59:19 +0000
format =E, d MMM yyyy HH:mm:ss Z
2018-12-27T09:59:19+0000
format =yyyy-MM-dd'T'HH:mm:ssZ
27.12.18
format =dd.MM.yy
09:59:19.815
format =HH:mm:ss.SSS
źródło
źródło
Możesz wypróbować ten szybki kod
źródło
SWIFT 5 , Xcode 11.0
Przekaż swój (data w ciągu) w „dateString” i w „dateFormat” formacie, który chcesz. Aby wybrać format, użyj strony NDateFormatter .
źródło
https://developer.apple.com/library/prerelease/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/index.html#//apple_ref/doc/uid/20000447-SW32
źródło