Ich versuche mit NSDate herauszufinden, ob das aktuelle Datum in einen Datumsbereich fällt oder nicht.
Beispielsweise können Sie mit NSDate das aktuelle Datum und die aktuelle Uhrzeit abrufen:
NSDate rightNow = [NSDate date];
Ich möchte dieses Datum dann verwenden, um zu überprüfen, ob es im Bereich von 9.00 bis 17.00 Uhr liegt .
objective-c
cocoa
cocoa-touch
datetime
nsdate
Brock Woolf
quelle
quelle
Antworten:
Ich habe eine Lösung gefunden. Wenn Sie eine bessere Lösung haben, können Sie diese gerne verlassen, und ich werde sie als korrekt markieren.
quelle
- (BOOL)isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate;
return !([date compare:startDate] == NSOrderedAscending || [date compare:endDate] == NSOrderedDescending);
Verwenden Sie im ersten Teil die Antwort von @kperryua , um die NSDate-Objekte zu erstellen, mit denen Sie vergleichen möchten. Aus Ihrer Antwort auf Ihre eigene Frage geht hervor, dass Sie das herausgefunden haben.
Für den tatsächlichen Vergleich der Daten stimme ich dem Kommentar von @Tim zu Ihrer Antwort voll und ganz zu. Es ist prägnanter und entspricht genau Ihrem Code, und ich werde erklären, warum.
Obwohl es den Anschein haben mag, dass die return-Anweisung beide Operanden des Operators && auswerten muss, ist dies tatsächlich nicht der Fall. Der Schlüssel ist " Kurzschlussauswertung ", die in einer Vielzahl von Programmiersprachen und sicherlich in C implementiert ist. Grundsätzlich die Operatoren
&
und&&
"Kurzschluss", wenn das erste Argument 0 ist (oder NO, Null usw.) , während|
und||
das gleiche tun , wenn das erste Argument ist nicht 0. wenndate
vor kommtbeginDate
, die Test kehrt ,NO
ohne auch nur mit zu vergleichen brauchenendDate
. Grundsätzlich funktioniert es genauso wie Ihr Code, jedoch in einer einzelnen Anweisung in einer Zeile, nicht in 5 (oder 7 mit Leerzeichen).Dies ist als konstruktive Eingabe gedacht, da Programmierer, die verstehen, wie ihre jeweilige Programmiersprache logische Ausdrücke bewertet, diese effektiver konstruieren können, ohne so viel über Effizienz zu wissen. Es gibt jedoch ähnliche Tests, die weniger effizient wären , da nicht alle Bediener kurzschließen. (In der Tat können die meisten nicht kurzschließen, z. B. numerische Vergleichsoperatoren.) Im Zweifelsfall ist es immer sicher, Ihre Logik explizit auseinanderzubrechen, aber Code kann viel besser lesbar sein, wenn Sie die Sprache / den Compiler die kleinen Dinge erledigen lassen für dich.
quelle
Brock Woolf Version in Swift:
quelle
Wenn Sie wissen möchten, ob das aktuelle Datum zwischen zwei bestimmten Zeitpunkten liegt (9.00 bis 17.00 Uhr am 01.07.09), erstellen Sie mit NSCalendar und NSDateComponents NSDate-Instanzen für die gewünschten Zeiten und vergleichen Sie sie mit dem aktuellen Datum.
Wenn Sie , wenn das aktuelle Datum zwischen diesen 2 Stunden fällt wissen wollen , jeden Tag, dann könnte man wahrscheinlich in die andere Richtung gehen. Erstellen Sie ein NSDateComponents-Objekt mit und NSCalendar und Ihrem NSDate und vergleichen Sie die Stundenkomponenten.
quelle
Wenn Sie auf iOS 10.0 + / macOS 10.12+ abzielen können, verwenden Sie die
DateInterval
Klasse.Erstellen Sie zunächst ein Datumsintervall mit einem Start- und Enddatum:
Überprüfen Sie dann mithilfe der folgenden
contains
Methode , ob das Datum im Intervall liegtDateInterval
:quelle
Dies kann einfach mithilfe der Zeitintervalle der Daten erreicht werden, wie folgt:
quelle
Die Fortsetzung der Lösungen von Quinn und Brock ist sehr hilfreich, um die NSDate-Implementierung in Unterklassen zu unterteilen, sodass sie überall wie folgt verwendet werden kann:
Und an jedem Teil Ihres Codes können Sie ihn verwenden als:
(myNSDate, thisNSDate und thatNSDate sind natürlich NSDates :)
quelle
Es gibt eine bessere und schnellere Lösung für dieses Problem.
Dann können Sie es so nennen.
Sogar Sie können das Datum zufällig übergeben, da diese Erweiterung prüft, welches Minimum ist und welches nicht.
Sie können es in Swift 3 und höher verwenden.
quelle
Mit Swift 5 können Sie eine der beiden folgenden Lösungen verwenden, um zu überprüfen, ob ein Datum zwischen zwei anderen Daten liegt.
# 1. Mit
DateInterval
dercontains(_:)
Methode vonDateInterval
hat eine Methode namenscontains(_:)
.contains(_:)
hat die folgende Erklärung:Der folgende Spielplatzcode zeigt, wie Sie
contains(_:)
überprüfen können, ob ein Datum zwischen zwei anderen Daten liegt:# 2. Mit
ClosedRange
dercontains(_:)
Methode vonClosedRange
hat eine Methode namenscontains(_:)
.contains(_:)
hat die folgende Erklärung:Der folgende Spielplatzcode zeigt, wie Sie
contains(_:)
überprüfen können, ob ein Datum zwischen zwei anderen Daten liegt:quelle
Eine bessere Version in Swift:
quelle