Ich frage mich, ob es eine neue und großartige Möglichkeit gibt, die Anzahl der Tage zwischen zwei NSDates in Swift / dem "neuen" Kakao zu ermitteln.
ZB wie in Ruby würde ich tun:
(end_date - start_date).to_i
ios
swift
date
date-difference
Linus
quelle
quelle
Antworten:
Sie müssen auch den Zeitunterschied berücksichtigen. Wenn Sie beispielsweise die Daten
2015-01-01 10:00
und vergleichen2015-01-02 09:00
, werden Tage zwischen diesen Daten als 0 (Null) zurückgegeben, da die Differenz zwischen diesen Daten weniger als 24 Stunden (23 Stunden) beträgt.Wenn Sie die genaue Tageszahl zwischen zwei Daten ermitteln möchten, können Sie dieses Problem folgendermaßen umgehen:
Swift 3 und Swift 4 Version
quelle
calendar.date(bySettingHour: 12, minute: 00, second: 00, of: calendar.startOfDay(for: firstDate))
startOfDay()
scheint unnötig zu sein) :calendar.date(bySettingHour: 12, minute: 0, second: 0, of: firstDate)
.Hier ist meine Antwort für Swift 2:
quelle
today
undtomorrow
Ich sehe ein paar Swift3-Antworten, also füge ich meine eigenen hinzu:
Die Benennung fühlt sich schneller an, es ist eine Zeile und mit der neuesten
dateComponents()
Methode.quelle
Ich habe meine Objective-C-Antwort übersetzt
Ergebnis
Das Schwierigste war, dass die automatische Vervollständigung darauf besteht, dass Datum und Datum vorliegen
NSDate?
, aber tatsächlich müssen sieNSDate!
den Angaben in der Referenz entsprechen.Ich sehe nicht ein, wie eine gute Lösung mit einem Operator aussehen würde, da Sie die Einheit jeweils anders spezifizieren möchten. Sie könnten das Zeitintervall zurückgeben, aber dann werden Sie nicht viel gewinnen.
quelle
.DayCalendarUnit
veraltet. Ich glaube jetzt solltest du.CalendarUnitDay
stattdessen verwenden.let components = cal.components(.Day, fromDate: startDate, toDate: endDate, options: [])
.Day
jetztHier ist eine sehr schöne
Date
Erweiterung, um Unterschiede zwischen Daten in Jahren, Monaten, Tagen, Stunden, Minuten, Sekunden zu erhaltenquelle
date
solltesinceDate
in Funktionsparametern sein.days
und es funktioniert gut.func years(since date: Date) -> Int? { return Calendar.current.dateComponents[.year], from: date, to: self).years }
, und Sie könnten es so nennenlet y = date1.years(since: date2)
. Dies könnte mit modernen Namenskonventionen vereinbar sein.Update für Swift 3 iOS 10 Beta 4
quelle
Hier ist die Antwort für Swift 3 (getestet für IOS 10 Beta)
Dann können Sie es so nennen
quelle
Swift 3. Vielen Dank an Emin Buğra Saral für den
startOfDay
Vorschlag.Verwendung:
quelle
Die Dinge, die in Swift eingebaut sind, sind immer noch sehr einfach. Wie sie in diesem frühen Stadium sein sollten. Sie können jedoch Ihre eigenen Inhalte hinzufügen, wobei das Risiko besteht, dass Operatoren und globale Domänenfunktionen überlastet werden. Sie sind jedoch lokal für Ihr Modul.
quelle
Hier ist meine Antwort für Swift 3:
quelle
Es gibt noch kaum eine Swift-spezifische Standardbibliothek. nur die schlanken grundlegenden numerischen, Zeichenfolgen- und Sammlungstypen.
Es ist durchaus möglich, solche Abkürzungen mithilfe von Erweiterungen zu definieren, aber was die eigentlichen Out-of-the-Box-APIs betrifft, gibt es keinen "neuen" Kakao. Swift wird nur direkt denselben alten ausführlichen Cocoa-APIs zugeordnet, die bereits vorhanden sind.
quelle
Ich werde meine Version hinzufügen, obwohl dieser Thread ein Jahr alt ist. Mein Code sieht folgendermaßen aus:
Ich hoffe es hilft jemandem.
Prost,
quelle
Erins Methode wurde auf Swift 3 aktualisiert. Dies zeigt Tage ab heute (ohne Berücksichtigung der Tageszeit).
quelle
Dies ergibt einen absoluten Unterschied in Tagen zwischen einigen
Date
und heute:und dann benutze es:
quelle
Sie können die folgende Erweiterung verwenden:
Dann können Sie es so nennen:
quelle
Swift 3.2
quelle
Alle Antworten sind gut. Für Lokalisierungen müssen wir jedoch eine Anzahl von Dezimaltagen zwischen zwei Daten berechnen. So können wir das nachhaltige Dezimalformat bereitstellen.
quelle
Dann benutze es gerne
quelle
Schnelle 3 - Tage von heute bis heute
Rufen Sie die Funktion so auf
quelle
Eine einfachere Möglichkeit wäre, am Datum eine Erweiterung zu erstellen
quelle
Wenn Sie Jahr, Monat, Tage und Stunden als Zeichenfolge benötigen, verwenden Sie diese Option
var morgen = Calendar.current.date (byAdding: .day, Wert: 1, bis: Date ())!
let dc = morgen.completeOffset (von: Date ())
quelle
Schöner handlicher Einzeiler:
quelle
quelle
Dies ist eine aktualisierte Version von Emins Antwort für Swift 5, die den Vorschlag enthält, Mittag anstelle von Mitternacht als endgültige Zeit für den Vergleich von Tagen zu verwenden. Es behandelt auch den möglichen Ausfall verschiedener Datumsfunktionen, indem ein optionales zurückgegeben wird.
quelle
Schnelle 5.2.4-Lösung:
quelle
Version 2017, kopieren und einfügen
quelle
quelle