Swift hat seinen eigenen DateTyp. Keine Notwendigkeit zu verwenden NSDate.
Erstellen eines Datums und einer Uhrzeit in Swift
In Swift werden Datum und Uhrzeit in einer 64-Bit-Gleitkommazahl gespeichert, die die Anzahl der Sekunden seit dem Referenzdatum vom 1. Januar 2001 um 00:00:00 UTC misst . Dies drückt sich in der DateStruktur aus . Folgendes gibt Ihnen das aktuelle Datum und die aktuelle Uhrzeit an:
let currentDateTime =Date()
Zum Erstellen anderer Datums- und Uhrzeitangaben können Sie eine der folgenden Methoden verwenden.
Methode 1
Wenn Sie die Anzahl der Sekunden vor oder nach dem Referenzdatum 2001 kennen, können Sie diese verwenden.
let someDateTime =Date(timeIntervalSinceReferenceDate:-123456789.0)//Feb2,1997,10:26 AM
Methode 2
Natürlich wäre es einfacher, Dinge wie Jahre, Monate, Tage und Stunden (anstatt relative Sekunden) zu verwenden, um eine zu erstellen Date. Hierzu können Sie DateComponentsdie Komponenten angeben und anschließend Calendardas Datum erstellen. Das Calendargibt den DateKontext. Wie würde es sonst wissen, in welcher Zeitzone oder in welchem Kalender es ausgedrückt werden soll?
// Specify date componentsvar dateComponents =DateComponents()
dateComponents.year =1980
dateComponents.month =7
dateComponents.day =11
dateComponents.timeZone =TimeZone(abbreviation:"JST")// Japan Standard TimedateComponents.hour =8
dateComponents.minute =34// Create date from componentslet userCalendar =Calendar.current // user calendarlet someDateTime = userCalendar.date(from: dateComponents)
Weitere Zeitzonenabkürzungen finden Sie hier . Wenn Sie dieses Feld leer lassen, wird standardmäßig die Zeitzone des Benutzers verwendet.
Methode 3
Der prägnanteste Weg (aber nicht unbedingt der beste) könnte sein DateFormatter.
let formatter =DateFormatter()
formatter.dateFormat ="yyyy/MM/dd HH:mm"let someDateTime = formatter.date(from:"2016/10/08 22:31")
In meiner vollständigen Antwort erfahren Sie, wie Sie Datum und Uhrzeit in einem lesbaren Format anzeigen. Lesen Sie auch diese ausgezeichneten Artikel:
Dies geschieht am besten mit einer Erweiterung der vorhandenen NSDateKlasse.
Die folgende Erweiterung fügt einen neuen Initialisierer hinzu, der ein Datum im aktuellen Gebietsschema unter Verwendung der Datumszeichenfolge in dem von Ihnen angegebenen Format erstellt.
Jetzt können Sie aus Swift ein NSDate erstellen, indem Sie Folgendes tun:
NSDate(dateString:"2014-06-06")
Beachten Sie, dass diese Implementierung den NSDateFormatter nicht zwischenspeichert, was Sie möglicherweise aus Leistungsgründen tun möchten, wenn Sie erwarten, dass viele NSDates auf diese Weise erstellt werden.
Bitte beachten Sie auch, dass diese Implementierung einfach abstürzt, wenn Sie versuchen, eine zu initialisieren, NSDateindem Sie eine Zeichenfolge übergeben, die nicht korrekt analysiert werden kann. Dies liegt am erzwungenen Entpacken des von zurückgegebenen optionalen Werts dateFromString. Wenn Sie eine nilfehlerhafte Analyse zurückgeben möchten, verwenden Sie idealerweise einen fehlerhaften Initialisierer. Aufgrund einer Einschränkung in Swift 1.2 können Sie dies jetzt (Juni 2015) nicht tun. Daher ist die nächstbeste Wahl die Verwendung einer Klassenfactory-Methode.
Es zeigt an, dass die Erweiterung einen Initialisierer bereitstellt, der die Initialisierung tatsächlich an einen bereits vorhandenen festgelegten Initialisierer delegiert, in diesem Fall an den Initialisierer NSDate.init (timeInterval :, SinceDate :). Dies wird auf Seite 295 des Buches The Swift Programming Language beschrieben.
Algen
1
Ein Fehler, den ich im obigen Code sehe, ist die Neuerstellung bei NSDateFormatterjedem Zugriff auf die Funktion. Wie Datumsformatierung Handbuch besagt ein Datum Erstellen Formatter kein billiges Betrieb ist . Außerdem ist die Klasse seit iOS7 threadsicher, sodass sie sicher für alle NSDateErweiterungen verwendet werden kann.
Yevhen Dubinin
@ Eugenedubinin richtig. Aus diesem Grund habe ich gesagt, dass "diese Implementierung den NSDateFormatter nicht zwischenspeichert, was Sie möglicherweise aus Leistungsgründen tun möchten".
Algen
1
Was ist die Einschränkung in Swift 1.2? Die Funktion "Failable Initialisierer" ist seit Swift 1.1 verfügbar .
Franklin Yu
48
Swift hat keinen eigenen Datumstyp, aber Sie können den vorhandenen Kakaotyp NSDateverwenden, z.
Ich musste die Zeile ändern: var date = gregorian? .DateFromComponents (c), aber ich verstehe nicht warum, und die Analyse gibt dateFmt.dateFromString zurück. Irgendwelche Hinweise? Ah, ich habe den Rückgabetyp der Funktion von NSDate in NSDate geändert. das lässt es kompilieren. Aber ich bin mir nicht sicher, warum es nullbar sein muss.
Der Senator
1
@TheSenator NSCalendar init gibt ein optionales (?) Zurück, sodass Gregorian ein optionales (?) Ist. Zugriff auf eine optionale Notwendigkeit zur optionalen Verkettung, um darauf zuzugreifen, also gregorian? .DateFromCoomponents ist die optionale Verkettung, um den Wert aus den Optionen gregorian (NSCalendar) zu entpacken. Mehr für optionale Verkettung hier
iluvatar_GR
NSGregorianCalendar ist ab iOS 8 veraltet. Verwenden Sie stattdessen NSCalendarIdentifierGregorian
Adam Knights
2
@ Der Senator beschwert sich, weil Swift die Datumsstruktur hat und dieser Code das Datum erneut als Klasse deklariert. Also solltest du etwas tun wie: 'Verlängerungsdatum' und 'statische Funktion'
Zaporozhchenko Oleksandr
Ein Memo über die Analysezeichenfolge zurück zu Datum. Eine Zeichenfolge "1979-07-01" mit "JJJJ-MM-TT" für die NSDateFormatterMethode date(from:). Es kehrt zurück nil. Ich habe dieses Problem im Absturzprotokoll von Fabric.io gefunden.
AechoLiu
12
So habe ich es in Swift 4.2 gemacht:
extensionDate{/// Create a date from specified parameters////// - Parameters:/// - year: The desired year/// - month: The desired month/// - day: The desired day/// - Returns: A `Date` objectstaticfunc from(year:Int, month:Int, day:Int)->Date?{let calendar =Calendar(identifier:.gregorian)var dateComponents =DateComponents()
dateComponents.year = year
dateComponents.month = month
dateComponents.day = dayreturn calendar.date(from: dateComponents)??nil}}
Verwendung:
let marsOpportunityLaunchDate =Date.from(year:2003, month:07, day:07)
Das Erstellen eines Datumsformatierers ist keine billige Operation. Wenn Sie wahrscheinlich häufig einen Formatierer verwenden, ist es in der Regel effizienter, eine einzelne Instanz zwischenzuspeichern, als mehrere Instanzen zu erstellen und zu entsorgen. Ein Ansatz besteht darin, eine statische Variable zu verwenden
Und obwohl ich @Leon zustimme, dass dies ein fehlgeschlagener Initialisierer sein sollte, könnten wir bei der Eingabe von Startdaten einen haben, der nicht fehlgeschlagen werden kann (genau wie es ihn gibt UIImage(imageLiteralResourceName:)).
NSDate
genau wie in Objective-C?Antworten:
Swift hat seinen eigenen
Date
Typ. Keine Notwendigkeit zu verwendenNSDate
.Erstellen eines Datums und einer Uhrzeit in Swift
In Swift werden Datum und Uhrzeit in einer 64-Bit-Gleitkommazahl gespeichert, die die Anzahl der Sekunden seit dem Referenzdatum vom 1. Januar 2001 um 00:00:00 UTC misst . Dies drückt sich in der
Date
Struktur aus . Folgendes gibt Ihnen das aktuelle Datum und die aktuelle Uhrzeit an:Zum Erstellen anderer Datums- und Uhrzeitangaben können Sie eine der folgenden Methoden verwenden.
Methode 1
Wenn Sie die Anzahl der Sekunden vor oder nach dem Referenzdatum 2001 kennen, können Sie diese verwenden.
Methode 2
Natürlich wäre es einfacher, Dinge wie Jahre, Monate, Tage und Stunden (anstatt relative Sekunden) zu verwenden, um eine zu erstellen
Date
. Hierzu können SieDateComponents
die Komponenten angeben und anschließendCalendar
das Datum erstellen. DasCalendar
gibt denDate
Kontext. Wie würde es sonst wissen, in welcher Zeitzone oder in welchem Kalender es ausgedrückt werden soll?Weitere Zeitzonenabkürzungen finden Sie hier . Wenn Sie dieses Feld leer lassen, wird standardmäßig die Zeitzone des Benutzers verwendet.
Methode 3
Der prägnanteste Weg (aber nicht unbedingt der beste) könnte sein
DateFormatter
.Die Unicode - technischen Standards zeigen andere Formate , dass
DateFormatter
Stützen.Anmerkungen
In meiner vollständigen Antwort erfahren Sie, wie Sie Datum und Uhrzeit in einem lesbaren Format anzeigen. Lesen Sie auch diese ausgezeichneten Artikel:
quelle
Dies geschieht am besten mit einer Erweiterung der vorhandenen
NSDate
Klasse.Die folgende Erweiterung fügt einen neuen Initialisierer hinzu, der ein Datum im aktuellen Gebietsschema unter Verwendung der Datumszeichenfolge in dem von Ihnen angegebenen Format erstellt.
Jetzt können Sie aus Swift ein NSDate erstellen, indem Sie Folgendes tun:
Beachten Sie, dass diese Implementierung den NSDateFormatter nicht zwischenspeichert, was Sie möglicherweise aus Leistungsgründen tun möchten, wenn Sie erwarten, dass viele
NSDate
s auf diese Weise erstellt werden.Bitte beachten Sie auch, dass diese Implementierung einfach abstürzt, wenn Sie versuchen, eine zu initialisieren,
NSDate
indem Sie eine Zeichenfolge übergeben, die nicht korrekt analysiert werden kann. Dies liegt am erzwungenen Entpacken des von zurückgegebenen optionalen WertsdateFromString
. Wenn Sie einenil
fehlerhafte Analyse zurückgeben möchten, verwenden Sie idealerweise einen fehlerhaften Initialisierer. Aufgrund einer Einschränkung in Swift 1.2 können Sie dies jetzt (Juni 2015) nicht tun. Daher ist die nächstbeste Wahl die Verwendung einer Klassenfactory-Methode.Ein ausführlicheres Beispiel, das beide Probleme behandelt, finden Sie hier: https://gist.github.com/algal/09b08515460b7bd229fa .
Update für Swift 5
quelle
NSDateFormatter
jedem Zugriff auf die Funktion. Wie Datumsformatierung Handbuch besagt ein Datum Erstellen Formatter kein billiges Betrieb ist . Außerdem ist die Klasse seit iOS7 threadsicher, sodass sie sicher für alleNSDate
Erweiterungen verwendet werden kann.Swift hat keinen eigenen Datumstyp, aber Sie können den vorhandenen Kakaotyp
NSDate
verwenden, z.Welche Sie verwenden können wie:
quelle
NSDateFormatter
Methodedate(from:)
. Es kehrt zurücknil
. Ich habe dieses Problem im Absturzprotokoll von Fabric.io gefunden.So habe ich es in Swift 4.2 gemacht:
Verwendung:
quelle
dateComponents
Laut Apple-Dokumentation
Beispiel:
quelle
In Swift 3.0 haben Sie auf diese Weise ein Datumsobjekt festgelegt.
quelle
Persönlich denke ich, dass es ein fehlerhafter Initialisierer sein sollte:
Andernfalls löst eine Zeichenfolge mit einem ungültigen Format eine Ausnahme aus.
quelle
Laut @mythz Antwort entscheide ich mich, eine aktualisierte Version seiner Erweiterung mit
swift3
Syntax zu veröffentlichen.Ich benutze keine
parse
Methode, aber wenn jemand benötigt, werde ich diesen Beitrag aktualisieren.quelle
Ich muss oft Datumswerte von einem Ort mit Zeitwerten für einen anderen kombinieren. Ich habe eine Hilfsfunktion geschrieben, um dies zu erreichen.
quelle
Laut Apples Datenformatierungshandbuch
Und obwohl ich @Leon zustimme, dass dies ein fehlgeschlagener Initialisierer sein sollte, könnten wir bei der Eingabe von Startdaten einen haben, der nicht fehlgeschlagen werden kann (genau wie es ihn gibt
UIImage(imageLiteralResourceName:)
).Also hier ist mein Ansatz:
Und jetzt viel Spaß beim Anrufen:
quelle