iOS: Vergleichen Sie zwei Daten

96

Ich habe eine NSDate, die ich mit anderen zwei vergleichen muss NSDateund ich versuche es mit NSOrderAscendingund NSOrderDescendingaber ob mein Datum bei anderen zwei Daten gleich ist?

Beispiel: Wenn ich eine myDate = 24/05/2011 und zwei andere habe, die eins = 24/05/2011und zwei sind, 24/05/2011was kann ich verwenden?

RadfahrenIsBetter
quelle
1
Ich verstehe Ihre Frage nicht ganz. Was versuchen Sie zu erreichen?
Arclight
Datum eins und Datum zwei können eins = 15/05/2011 und zwei = 31/05/2011 sein, aber sie müssen auch am selben Tag eins = 24/05/2011 und zwei = 24/05/2011 sein, dann muss ich prüfen, ob myData liegt zwischen Datum eins und Datum zwei
CyclingIsBetter
Extrahieren Sie einfach das Jahr, den Monat und das Datum und vergleichen Sie sie in dieser Reihenfolge. Wenn es ein Unentschieden gibt, vergleichen Sie das nächste Feld.
Himadri Choudhury

Antworten:

210

Laut Apple-Dokumentation vonNSDate compare:

Gibt einen NSComparisonResult-Wert zurück, der die zeitliche Reihenfolge des Empfängers und ein anderes angegebenes Datum angibt.

- (NSComparisonResult)compare:(NSDate *)anotherDate

Parameter anotherDate

Das Datum, mit dem der Empfänger verglichen werden soll. Dieser Wert darf nicht Null sein. Wenn der Wert Null ist, ist das Verhalten undefiniert und kann sich in zukünftigen Versionen von Mac OS X ändern.

Rückgabewert

Wenn:

Der Empfänger und ein anderes Datum sind genau gleich, NSOrderedSame

Der Empfänger ist später als ein anderes Datum, NSOrderedDescending

Der Empfänger ist früher als ein anderes Datum. NSOrderedAscending

Mit anderen Worten:

if ([date1 compare:date2] == NSOrderedSame) ...

Beachten Sie, dass es in Ihrem speziellen Fall möglicherweise einfacher ist, Folgendes zu lesen und zu schreiben:

if ([date2 isEqualToDate:date2]) ...

Siehe dazu die Apple-Dokumentation .

Vincent Guerci
quelle
aber f ([date1 compare: date2] == NSOrderedSame) überprüfen Sie auch die Stunde Minute und Sekunden und ich will es nicht
CyclingIsBetter
1
Ihre Frage war etwas unklar. Entschuldigung. Schauen Sie sich stackoverflow.com/questions/1889164/3092009#3092009 an . Sie finden die Antwort darauf.
Vincent Guerci
Diese Antwort ist in beiden Punkten richtig. Um die Datumskomponenten zu steuern, die Sie vergleichen, verwenden SieNSDateComponents
Nazir
32

Nachdem ich viel im Stackoverflow und im Web gesucht habe, muss ich zu dem Schluss kommen, dass der beste Weg, dies zu tun, folgender ist:

- (BOOL)isEndDateIsSmallerThanCurrent:(NSDate *)checkEndDate
{
    NSDate* enddate = checkEndDate;
    NSDate* currentdate = [NSDate date];
    NSTimeInterval distanceBetweenDates = [enddate timeIntervalSinceDate:currentdate];
    double secondsInMinute = 60;
    NSInteger secondsBetweenDates = distanceBetweenDates / secondsInMinute;

    if (secondsBetweenDates == 0)
        return YES;
    else if (secondsBetweenDates < 0)
        return YES;
    else
        return NO;
}

Sie können es auch ändern, um zwischen Stunden zu unterscheiden.

Genießen!


Bearbeiten 1

Wenn Sie das Datum nur mit dem Format TT / MM / JJJJ vergleichen möchten, müssen Sie die folgenden Zeilen zwischen NSDate* currentdate = [NSDate date];&& einfügenNSTimeInterval distance

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd/MM/yyyy"];
[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]
                          autorelease]];

NSString *stringDate = [dateFormatter stringFromDate:[NSDate date]];

currentdate = [dateFormatter dateFromString:stringDate];
Yossi Tsafar
quelle
1
Danke, das funktioniert besser als vergleichen oder isEqualToDate
ArdenDev
Einverstanden. Ich habe Probleme mit compare & isEqualToDate gefunden. Sicher, es können zusätzliche 2 Codezeilen sein, aber es ist zuverlässiger.
Trainer Roebuck
23

Ich nehme an, Sie fragen, was der Rückgabewert in der Vergleichsfunktion ist.

Wenn die Daten gleich sind, kehren Sie zurück NSOrderedSame

Wenn aufsteigend (2. Argument> 1. Argument), kehren Sie zurück NSOrderedAscending

Wenn absteigend (2. Argument <1. ​​Argument), kehren Sie zurück NSOrderedDescending

Himadri Choudhury
quelle
Gute Möglichkeit, an Auf- und Abstieg zu denken.
David
16

Ich weiß nicht genau, ob Sie dies gefragt haben, aber wenn Sie nur die Datumskomponente eines NSDate vergleichen möchten, müssen Sie NSCalendar und NSDateComponents verwenden, um die Zeitkomponente zu entfernen.

So etwas sollte als Kategorie für NSDate funktionieren:

- (NSComparisonResult)compareDateOnly:(NSDate *)otherDate {
    NSUInteger dateFlags = NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit;
    NSCalendar *gregorianCalendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    NSDateComponents *selfComponents = [gregorianCalendar components:dateFlags fromDate:self];
    NSDate *selfDateOnly = [gregorianCalendar dateFromComponents:selfComponents];

    NSDateComponents *otherCompents = [gregorianCalendar components:dateFlags fromDate:otherDate];
    NSDate *otherDateOnly = [gregorianCalendar dateFromComponents:otherCompents];
    return [selfDateOnly compare:otherDateOnly];
}
Matthias Bauch
quelle
2

NSDaterepräsentiert tatsächlich ein Zeitintervall in Sekunden seit einem Referenzdatum (1. Januar 2000 UTC, glaube ich). Intern wird eine Gleitkommazahl mit doppelter Genauigkeit verwendet, sodass es sehr unwahrscheinlich ist, dass zwei beliebige Daten gleich sind, selbst wenn sie am selben Tag liegen. Wenn Sie sehen möchten, ob ein bestimmtes Datum auf einen bestimmten Tag fällt, müssen Sie wahrscheinlich verwenden NSDateComponents. z.B

NSDateComponents* dateComponents = [[NSDateComponents alloc] init];
[dateComponents setYear: 2011];
[dateComponents setMonth: 5];
[dateComponents setDay: 24];
/*
 *  Construct two dates that bracket the day you are checking.  
 *  Use the user's current calendar.  I think this takes care of things like daylight saving time.
 */
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDate* startOfDate = [calendar dateFromComponents: dateComponents];
NSDateComponents* oneDay = [[NSDateComponents alloc] init];
[oneDay setDay: 1];
NSDate* endOfDate = [calendar dateByAddingComponents: oneDay toDate: startOfDate options: 0];
/*
 *  Compare the date with the start of the day and the end of the day.
 */
NSComparisonResult startCompare = [startOfDate compare: myDate];
NSComparisonResult endCompare = [endOfDate compare: myDate];

if (startCompare != NSOrderedDescending && endCompare == NSOrderedDescending)
{
    // we are on the right date
} 
JeremyP
quelle
2

Überprüfen Sie die folgende Funktion für den Datumsvergleich. Erstellen Sie zunächst zwei NSDate-Objekte und übergeben Sie sie an die Funktion: Fügen Sie die folgenden Codezeilen in viewDidload oder entsprechend Ihrem Szenario hinzu.

-(void)testDateComaparFunc{

NSString *getTokon_Time1 = @"2016-05-31 03:19:05 +0000";
NSString *getTokon_Time2 = @"2016-05-31 03:18:05 +0000";
NSDateFormatter *dateFormatter=[NSDateFormatter new];
[dateFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss Z"];
NSDate *tokonExpireDate1=[dateFormatter dateFromString:getTokon_Time1];
NSDate *tokonExpireDate2=[dateFormatter dateFromString:getTokon_Time2];
BOOL isTokonValid = [self dateComparision:tokonExpireDate1 andDate2:tokonExpireDate2];}

Hier ist die Funktion

-(BOOL)dateComparision:(NSDate*)date1 andDate2:(NSDate*)date2{

BOOL isTokonValid;

if ([date1 compare:date2] == NSOrderedDescending) {
    //"date1 is later than date2
    isTokonValid = YES;
} else if ([date1 compare:date2] == NSOrderedAscending) {
    //date1 is earlier than date2
    isTokonValid = NO;
} else {
   //dates are the same
    isTokonValid = NO;

}

return isTokonValid;}

Ändern Sie einfach das Datum und testen Sie die obige Funktion :)

Akhtar
quelle