Frage

ich, um herauszufinden, ich versuche, ob das aktuelle Datum innerhalb eines Zeitraums mit NSDate.

Zum Beispiel können Sie die aktuelle Datum / Zeit mit NSDate erhalten:

NSDate rightNow = [NSDate date];

dann mag ich dieses Datum verwenden, um zu überprüfen, ob es im Bereich von 09.00 Uhr ist -. 05.00

War es hilfreich?

Lösung

Ich kam mit einer Lösung auf. Wenn Sie eine bessere Lösung haben, fühlen Sie sich frei, es zu verlassen, und ich werde es als richtig markieren.

+ (BOOL)date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate
{
    if ([date compare:beginDate] == NSOrderedAscending)
        return NO;

    if ([date compare:endDate] == NSOrderedDescending) 
        return NO;

    return YES;
}

Andere Tipps

Für den ersten Teil, verwenden Sie die Antwort von @kperryua zu konstruieren, die NSDate-Objekte, mit denen Sie vergleichen möchten. Aus Ihrer Antwort auf Ihre eigene Frage, es klingt wie Sie haben die herausgefunden.

tatsächlich die Daten zu vergleichen, ich bin vollkommen einverstanden mit @ Tim 's Kommentar zu Ihrer Antwort. Es ist prägnanter noch eigentlich genau entspricht Ihren Code, und ich werde erklären, warum.

+ (BOOL) date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate {
    return (([date compare:beginDate] != NSOrderedAscending) && ([date compare:endDate] != NSOrderedDescending));
}

Auch wenn es scheinen mag, dass die return-Anweisung beide Operanden des && Operator auswerten müssen, ist dies tatsächlich nicht der Fall. Der Schlüssel ist, „ Kurzschluss Auswertung “, die in einer Vielzahl von Programmierung implementiert wird Sprachen, und sicherlich in C. Grundsätzlich ist die Operatoren & und && "Kurzschluss", wenn das erste Argument 0 (oder NO, nil, etc.), während < strong> | und || das gleiche tun, wenn das erste Argument nicht 0. wenn date vor beginDate kommt, NO die Test kehrt, ohne auch nur mit zu vergleichen, um endDate. Im Grunde ist es macht das gleiche wie Sie Ihren Code, sondern in einer einzigen Anweisung in einer Zeile, nicht mehr als 5 (oder 7, mit Leerzeichen).

Dies ist als konstruktiver Beitrag gedacht, da, wenn Programmierer die Möglichkeit, ihre spezielle Programmiersprache wertet logische Ausdrücke verstehen, sie sie effektiver, ohne so viel über die Effizienz konstruieren können. Allerdings gibt es Ähnliche Tests, die würde weniger effizient sein, da nicht alle Betreiber Kurzschluss. (In der Tat, die meisten nicht Kurzschluss, wie numerische Vergleichsoperator). Im Zweifelsfall ist es immer sicher ist, explizit zu sein, Ihre Logik zu brechen auseinander, aber Code kann viel besser lesbar sein, wenn Sie das lassen Sprache / Compiler die kleinen Dinge für Sie.

Brock Woolf Version in Swift:

extension NSDate
{
    func isBetweenDates(beginDate: NSDate, endDate: NSDate) -> Bool
    {
        if self.compare(beginDate) == .OrderedAscending
        {
            return false
        }

        if self.compare(endDate) == .OrderedDescending
        {
            return false
        }

        return true
    }
}

Wenn Sie wollen wissen, ob das aktuelle Datum fällt zwischen zwei bestimmten Zeitpunkt (von 9.00 bis 17.00 Uhr auf 7/1/09), verwendet NSCalendar und NSDateComponents NSDate Instanzen für die gewünschten Zeiten zu bauen und vergleichen sie mit dem aktuellen Datum .

Wenn Sie wissen wollen, ob das aktuelle Datum zwischen diesen 2 Stunden fällt alle Tag, dann könnte man wahrscheinlich in die andere Richtung gehen. Erstellen Sie ein NSDateComponents Objekt mit und NSCalendar und Ihre NSDate und vergleichen Sie die Stunde Komponenten.

Dies kann leicht erreicht werden, die Termine für Zeitintervalle, etwa so:

const NSTimeInterval i = [date timeIntervalSinceReferenceDate];
return ([startDate timeIntervalSinceReferenceDate] <= i &&
        [endDate timeIntervalSinceReferenceDate] >= i);

Weiter mit Quinn und Brock's Lösungen, ist sehr schön NSDate Implementierung Unterklasse, so kann es so überall verwendet werden:

-(BOOL) isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate {
    return (([self compare:beginDate] != NSOrderedAscending) && ([self compare:endDate] != NSOrderedDescending));
}

Und in jedem Teil des Codes können Sie es als verwenden:

[myNSDate isBetweenDate:thisNSDate andDate:thatNSDate];

(myNSDate, thisNSDate und thatNSDate sind natürlich NSDates :)

Wenn Sie iOS 10.0 + / macOS 10.12+, dann verwenden Sie die DateInterval Klasse ausrichten können.

Erstellen Sie zuerst ein Datum Intervall mit einem Start- und Enddatum:

let start: Date = Date()
let middle: Date = Date()
let end: Date = Date()

let dateInterval: DateInterval = DateInterval(start: start, end: end)

Dann prüfen, ob das Datum in die contains Methode von DateInterval im Intervall:

let dateIsInInterval: Bool = dateInterval.contains(middle) // true

Es ist besser und swifty Lösung für dieses Problem.

extention Date {
    func isBetween(from startDate: Date,to endDate: Date) -> Bool {
        let result = (min(startDate, endDate) ... max(startDate, endDate)).contains(self)
        return result
    }
}

Dann können Sie es so nennen.

todayDate.isBetween(from: startDate, to: endDate)

Auch können Sie Datum zufällig wie diese Erweiterung Prüfungen bestanden werden, die ein Minimum ist und welches nicht.

Sie können es in schnellen 3 verwenden und darüber.

Mit Swift 5, eine der beiden Lösungen unten verwenden kann, um zu überprüfen, ob ein Datum zwischen zwei anderen Terminen stattfindet.


# 1. Mit DateInterval der contains(_:) Methode

DateInterval hat eine Methode namens contains(_:) . contains(_:) hat die folgende Erklärung:

func contains(_ date: Date) -> Bool
  

Gibt an, ob dieses Intervall das angegebene Datum enthält.

Der folgende Code zeigt, wie Spielplatz contains(_:) verwenden, um zu überprüfen, ob ein Datum zwischen zwei anderen Terminen statt:

import Foundation

let calendar = Calendar.current
let startDate = calendar.date(from: DateComponents(year: 2010, month: 11, day: 22))!
let endDate = calendar.date(from: DateComponents(year: 2015, month: 5, day: 1))!
let myDate = calendar.date(from: DateComponents(year: 2012, month: 8, day: 15))!

let dateInterval = DateInterval(start: startDate, end: endDate)
let result = dateInterval.contains(myDate)
print(result) // prints: true

# 2. Mit ClosedRange der contains(_:) Methode

ClosedRange hat eine Methode namens contains(_:) . contains(_:) hat die folgende Erklärung:

func contains(_ element: Bound) -> Bool
  

Gibt einen Booleschen Wert, der angibt, ob das angegebene Element innerhalb des Bereichs enthalten ist.

Der folgende Code zeigt, wie Spielplatz contains(_:) verwenden, um zu überprüfen, ob ein Datum zwischen zwei anderen Terminen statt:

import Foundation

let calendar = Calendar.current
let startDate = calendar.date(from: DateComponents(year: 2010, month: 11, day: 22))!
let endDate = calendar.date(from: DateComponents(year: 2015, month: 5, day: 1))!
let myDate = calendar.date(from: DateComponents(year: 2012, month: 8, day: 15))!

let range = startDate ... endDate
let result = range.contains(myDate)
//let result = range ~= myDate // also works
print(result) // prints: true

Eine bessere Version in Swift:

@objc public class DateRange: NSObject {
    let startDate: Date
    let endDate: Date

    init(startDate: Date, endDate: Date) {
        self.startDate = startDate
        self.endDate = endDate
    }

    @objc(containsDate:)
    func contains(_ date: Date) -> Bool {
        let startDateOrder = date.compare(startDate)
        let endDateOrder = date.compare(endDate)
        let validStartDate = startDateOrder == .orderedAscending || startDateOrder == .orderedSame
        let validEndDate = endDateOrder == .orderedDescending || endDateOrder == .orderedSame
        return validStartDate && validEndDate
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top