Die alten Antworten hier sind wirklich falsch . Das Apple-Dokument sagt kristallklar, dass Sie den Formatierer zwischenspeichern müssen. 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 */)
Überprüfen Sie für weitere Abfragen die NSDateFormatter- und DateFormatter- Klassen des Foundation- Frameworks für Objective-C bzw. Swift.
Swift 3 und höher (Swift 4 enthalten)
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
Gefunden, die Lösung muss nur "JJJJ-MM-TT hh: mm: ss.SSSSxxx" dieses Datumsformat setzen
Shardul
1
Ich habe eine Datumszeichenfolge wie diese "2014-07-15 06: 55: 14-0400" und ich habe versucht, sie zu verwenden yyyy-MM-dd hh:mm:ssZZZ. Aber ich kann das Datumsobjekt nicht aus der Zeichenfolge herausholen.
iamprem
2
@Prem, wenn Sie sehen, dass die Ausgabe "2014-07-15 10:55:14 +0000"korrekt ist. Wie aus der NSDateBeschreibung hervorgeht, würde die Ausgabe des Datums mit Differenz berechnet (hier GMT -4 Stunden). Wenn Sie den Unterschied zwischen GMT und UTC erhalten möchten, -0400überprüfen Sie diese Referenz
x4h1d
@ x4h1d, Hey ich habe es! Ich habe einen Fehler gemacht, bei hhdem es sein sollte HH. Vielen Dank!
iamprem
3
@ lmiguelvargasf, ich denke das wäre yyyy-MM-dd'T'HH:mm:ss.SSS'Z'. Ich nahm an, dass Zes hier nur ein Charakter ist. Denken Sie daran, Zhat auch eine besondere Bedeutung. Wenn Sie Zangeben möchten , wie basic hmsdas Format wäre yyyy-MM-dd'T'HH:mm:ss.SSSZ.
x4h1d
71
Swift 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)
Swift 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)
Der Code ist nicht richtig. Es gibt einige "15. Januar 2014, 00:00 Uhr"
Jake Lin
5
Die Verwendung von ddanstelle von DDsollte helfen, das Problem "immer Januar" zu beheben.
Pascal Belloncle
1
Die richtige Version ist, yyyy-MM-ddandernfalls bleibt das analysierte Datum im Januar hängen - ich habe die Antwort aktualisiert, um die Änderung widerzuspiegeln.
Zorayr
Was ist, wenn ich das aktuelle Datum als Zeichenfolge übergeben möchte? Ob das funktioniert?
Arjun Kalidas
@Zorayr, Kittisak: Ich bekomme die Ausgabe, Optional (2014-07-14 18:30:00 +0000), das heißt, ein Tag wird dekrementiert. Wie kann ich das beheben?
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
}
Aktualisiert für 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
}
Wenn Sie die Zeichenfolge häufig in ein Datum analysieren müssen, möchten Sie die Funktionalität möglicherweise in eine Erweiterung verschieben. Ich habe eine sharedCode.swift-Datei erstellt und meine Erweiterungen dort abgelegt:
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
}}
Wenn Sie dann Ihren String in ein NSDate konvertieren möchten, können Sie einfach Folgendes schreiben:
Vielen Dank. Es ist auch möglich, obwohl weniger nützlich, Folgendes zu schreiben: var myDate = "04-05-2015" .toDateTime () Ich fand dies praktisch, wenn ich Testdaten einrichtete.
Stephen Watson
1
Ich bin mir ziemlich sicher , dass das hhsollte HHin diesem Fall.
Alex
Dies gibt mir nicht das von mir angegebene Format: var date = NSDate (); let dateFormatter = NSDateFormatter (); dateFormatter.dateFormat = "MMMM d, JJJJ"; let myDate = dateFormatter.stringFromDate (Datum); Und obendrein, wenn ich Ihre Erweiterung wie folgt verwende -> var myDate2 = myDate.toDateTime (); Es gibt mir ein ganz anderes Datum und nicht das aktuelle Datum.
Cache-Formatierer für mehr Effizienz
Das Erstellen eines Datumsformatierers ist kein billiger Vorgang. ... eine einzelne Instanz zwischenspeichern ...
Verwenden Sie eine globale ...
let df :DateFormatter={let formatter =DateFormatter()
formatter.dateFormat ="yyyy-MM-dd"return formatter
}()
Dann verwenden Sie diesen Formatierer einfach überall ...
let s = df.string(from: someDate)
oder
let d = df.date(from: someString)
Oder verwenden Sie eine der vielen anderen praktischen Methoden für DateFormatter.
So einfach ist das.
(Wenn Sie eine Erweiterung für String schreiben, ist Ihr Code vollständig "verkehrt herum" - Sie können keine dateFormatter-Aufrufe verwenden!)
Beachten Sie, dass Sie normalerweise einige dieser globalen Elemente haben, z. B. "formatForClient" "formatForPubNub" "formatForDisplayOnInvoiceScreen" usw.
Sie müssen nicht im globalen Bereich belassen werden. Sie können Formatter erweitern, indem Sie Ihre Eigenschaften als statisch deklarieren. Überprüfen Sie diese stackoverflow.com/a/43658213/2303865
Leo Dabus
4
Swift Verlängerungen, mit der Erweiterung können Sie eine neue Funktionalität zu einem bestehenden hinzufügen class, structure, enumeration, oder protocolTyp.
Sie können dem Objekt eine neue initFunktion hinzufügen , NSDateindem Sie das Objekt mit dem extensionSchlüsselwort erweitern.
Ich mag den Init-Weg. Gibt es nicht eine andere Möglichkeit, das Datum ohne timeInterval zu erstellen? Was ist, wenn nsdate keinen Initialisierer mit einem Datumsparameter mehr hat? Wie würden Sie es lösen? Persönlich bevorzuge ich einen Init-Weg, aber ich weiß nicht, wie ich dieses Problem überwinden soll
Mijail
Ich habe ein Problem: Mein Datum als Zeichenfolge lautet wie folgt: "2017-03-10 22:16:00 +0000" und ich habe dieses Format verwendet: "JJJJ-MM-TT HH: MM: SS Z" und dieses: "JJJJ-MM-TT'T'HH: MM: SS". Aber für beide, wenn ich das mache: let beginDate = df.date(from: beginDateString), ich bekomme eine Null! Warum? ( df = DateFormatter())
Paul Bénéteau
4
Seit Swift 3 wurden viele der NS-Präfixe gelöscht.
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)
Ich habe ein Problem: Mein Datum als Zeichenfolge lautet wie folgt: "2017-03-10 22:16:00 +0000" und ich habe dieses Format verwendet: "JJJJ-MM-TT HH: MM: SS Z" und dieses: "JJJJ-MM-TT'T'HH: MM: SS". Aber für beide, wenn ich das mache: let beginDate = df.date(from: beginDateString), ich bekomme eine Null! Warum? ( df = DateFormatter())
Paul Bénéteau
4
Swift 3,4:
2 nützliche Konvertierungen:
string(from:Date)// to convert from Date to a String
date(from:String)// to convert from String to Date
Verwendungszweck 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)
Übergeben Sie Ihr (Datum in Zeichenfolge) im gewünschten Datumsformat "dateString" und "dateFormat". Verwenden Sie zur Auswahl des Formats die NDateFormatter-Website .
func getDateFrom(dateString:String, dateFormat:String)->Date?{let dateFormatter =DateFormatter()
dateFormatter.dateFormat = dateFormat
dateFormatter.locale =Locale(identifier:"en_US")guardlet date = dateFormatter.date(from: dateString)else{returnnil}return date
}
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
Wie soll das funktionieren? Der Datumsformatierer ist nicht initialisiert und es gibt auch keinen Grund, die Deklaration und Initialisierung des Datums aufzuteilen.
Antworten:
Versuche dies:
Überprüfen Sie für weitere Abfragen die NSDateFormatter- und DateFormatter- Klassen des Foundation- Frameworks für Objective-C bzw. Swift.
Swift 3 und höher (Swift 4 enthalten)
quelle
yyyy-MM-dd hh:mm:ssZZZ
. Aber ich kann das Datumsobjekt nicht aus der Zeichenfolge herausholen."2014-07-15 10:55:14 +0000"
korrekt ist. Wie aus derNSDate
Beschreibung hervorgeht, würde die Ausgabe des Datums mit Differenz berechnet (hier GMT -4 Stunden). Wenn Sie den Unterschied zwischen GMT und UTC erhalten möchten,-0400
überprüfen Sie diese Referenzhh
dem es sein sollteHH
. Vielen Dank!yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
. Ich nahm an, dassZ
es hier nur ein Charakter ist. Denken Sie daran,Z
hat auch eine besondere Bedeutung. Wenn SieZ
angeben möchten , wiebasic hms
das Format wäreyyyy-MM-dd'T'HH:mm:ss.SSSZ
.Swift 4
Swift 3
Ich kann es mit diesem Code machen.
quelle
dd
anstelle vonDD
sollte helfen, das Problem "immer Januar" zu beheben.yyyy-MM-dd
andernfalls bleibt das analysierte Datum im Januar hängen - ich habe die Antwort aktualisiert, um die Änderung widerzuspiegeln.Aktualisiert für Swift 3.
quelle
Einzelheiten
Lösung
Verwendung
Ergebnis
Mehr Informationen
Informationen zum Datumsformat
quelle
Wenn Sie die Zeichenfolge häufig in ein Datum analysieren müssen, möchten Sie die Funktionalität möglicherweise in eine Erweiterung verschieben. Ich habe eine sharedCode.swift-Datei erstellt und meine Erweiterungen dort abgelegt:
Wenn Sie dann Ihren String in ein NSDate konvertieren möchten, können Sie einfach Folgendes schreiben:
quelle
hh
sollteHH
in diesem Fall.Für Swift 3
quelle
Die Codefragmente auf dieser QS-Seite sind "verkehrt herum" ...
Das erste, was Apple erwähnt, ist, dass Sie Ihren Formatierer zwischenspeichern ...
Link zu Apple Doco, in dem genau angegeben ist, wie das geht:
Verwenden Sie eine globale ...
Dann verwenden Sie diesen Formatierer einfach überall ...
oder
Oder verwenden Sie eine der vielen anderen praktischen Methoden für DateFormatter.
So einfach ist das.
(Wenn Sie eine Erweiterung für String schreiben, ist Ihr Code vollständig "verkehrt herum" - Sie können keine dateFormatter-Aufrufe verwenden!)
Beachten Sie, dass Sie normalerweise einige dieser globalen Elemente haben, z. B. "formatForClient" "formatForPubNub" "formatForDisplayOnInvoiceScreen" usw.
quelle
Swift Verlängerungen, mit der Erweiterung können Sie eine neue Funktionalität zu einem bestehenden hinzufügen
class
,structure
,enumeration
, oderprotocol
Typ.Sie können dem Objekt eine neue
init
Funktion hinzufügen ,NSDate
indem Sie das Objekt mit demextension
Schlüsselwort erweitern.Jetzt können Sie ein NSDate-Objekt mit folgenden Elementen initiieren:
quelle
df.date(from: beginDateString)
, ich bekomme eine Null! Warum? (df = DateFormatter()
)Seit Swift 3 wurden viele der NS-Präfixe gelöscht.
quelle
df.date(from: beginDateString)
, ich bekomme eine Null! Warum? (df = DateFormatter()
)Swift 3,4:
2 nützliche Konvertierungen:
Verwendungszweck 1.
2.
quelle
FÜR SWIFT 3.1
HINWEIS: Dadurch wird die ursprüngliche Zeichenfolge bei einem Fehler zurückgegeben
quelle
Um eine Zeichenfolge im Datumsformat in Swift hinzuzufügen, habe ich dies getan
quelle
Diese Arbeit für mich ..
quelle
Im Folgenden finden Sie einige Konvertierungsoptionen für Zeichenfolgen in Datumsformate, die in schnellem iOS verwendet werden können.
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
quelle
quelle
Sie können diesen schnellen Code ausprobieren
quelle
SWIFT 5 , Xcode 11.0
Übergeben Sie Ihr (Datum in Zeichenfolge) im gewünschten Datumsformat "dateString" und "dateFormat". Verwenden Sie zur Auswahl des Formats die NDateFormatter-Website .
quelle
https://developer.apple.com/library/prerelease/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/index.html#//apple_ref/doc/uid/20000447-SW32
quelle