it-swarm.com.de

So vergleichen Sie zwei NSDates: Welches ist neuer?

Ich versuche, eine DropBox-Synchronisierung zu erreichen, und muss die Daten zweier Dateien vergleichen. Einer ist auf meinem dropBox-Konto und einer auf meinem iPhone. 

Ich habe mir folgendes ausgedacht, bekomme aber unerwartete Ergebnisse. Ich denke, ich mache etwas grundlegend falsch, wenn ich die beiden Daten miteinander vergleiche. Ich habe einfach die Operatoren> <verwendet, aber ich denke, das ist nicht gut, da ich zwei NSDate-Strings vergleiche. Auf geht's:

NSLog(@"dB...lastModified: %@", dbObject.lastModifiedDate); 
NSLog(@"iP...lastModified: %@", [self getDateOfLocalFile:@"NoteBook.txt"]);

if ([dbObject lastModifiedDate] < [self getDateOfLocalFile:@"NoteBook.txt"]) {
    NSLog(@"...db is more up-to-date. Download in progress...");
    [self DBdownload:@"NoteBook.txt"];
    NSLog(@"Download complete.");
} else {
    NSLog(@"...iP is more up-to-date. Upload in progress...");
    [self DBupload:@"NoteBook.txt"];
    NSLog(@"Upload complete.");
}

Dies gab mir die folgende (zufällige und falsche) Ausgabe:

2011-05-11 14:20:54.413 NotePage[6918:207] dB...lastModified: 2011-05-11 13:18:25 +0000
2011-05-11 14:20:54.414 NotePage[6918:207] iP...lastModified: 2011-05-11 13:20:48 +0000
2011-05-11 14:20:54.415 NotePage[6918:207] ...db is more up-to-date.

oder diese, die zufällig richtig ist:

2011-05-11 14:20:25.097 NotePage[6903:207] dB...lastModified: 2011-05-11 13:18:25 +0000
2011-05-11 14:20:25.098 NotePage[6903:207] iP...lastModified: 2011-05-11 13:19:45 +0000
2011-05-11 14:20:25.099 NotePage[6903:207] ...iP is more up-to-date.
237
n.evermind

Nehmen wir zwei Termine an:

NSDate *date1;
NSDate *date2;

Dann zeigt der folgende Vergleich, welcher früher/später/gleich ist:

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

Weitere Informationen finden Sie in der Dokumentation zur Klasse NSDate .

641
Nick Weaver

Spät zur Party, aber eine andere einfache Möglichkeit, NSDate-Objekte zu vergleichen, besteht darin, sie in primitive Typen umzuwandeln, was die Verwendung von '>' '<' '==' usw

z.B.

if ([dateA timeIntervalSinceReferenceDate] > [dateB timeIntervalSinceReferenceDate]) {
    //do stuff
}

timeIntervalSinceReferenceDate konvertiert das Datum in Sekunden seit dem Referenzdatum (1. Januar 2001, GMT). Da timeIntervalSinceReferenceDate ein NSTimeInterval zurückgibt (was ein Doppeltyp ist), können wir primitive Komparatoren verwenden.

47
So Over It

In Swift können Sie vorhandene Operatoren überladen:

func > (lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.timeIntervalSinceReferenceDate > rhs.timeIntervalSinceReferenceDate
}

func < (lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.timeIntervalSinceReferenceDate < rhs.timeIntervalSinceReferenceDate
}

Anschließend können Sie NSDates direkt mit <, > und == (bereits unterstützt) vergleichen.

14
Andrew

NSDate hat eine Vergleichsfunktion.

compare: Gibt einen NSComparisonResult-Wert zurück, der die zeitliche Reihenfolge des Empfängers und ein anderes gegebenes 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 genau gleich sind, NSOrderedSame
  • Wenn der Empfänger später als ein anderes Datum ist, NSOrderedDescending
  • Wenn der Empfänger zeitlich vor einem anderen Datum liegt, NSOrderedAscending.
13
Gary

Sie möchten die NSDate-Methoden compare :, laterDate :, beforeDate: oder isEqualToDate: verwenden. Bei Verwendung der Operatoren <und> werden in dieser Situation die Zeiger und nicht die Datumsangaben verglichen

12
Dan F
- (NSDate *)earlierDate:(NSDate *)anotherDate

Dies gibt den früheren Empfänger und ein anderes Datum zurück. Wenn beide gleich sind, wird der Empfänger zurückgegeben.

11
user745098

Einige Datums-Dienstprogramme, einschließlich Vergleiche in Englisch, die Nizza ist:

#import <Foundation/Foundation.h>


@interface NSDate (Util)

-(BOOL) isLaterThanOrEqualTo:(NSDate*)date;
-(BOOL) isEarlierThanOrEqualTo:(NSDate*)date;
-(BOOL) isLaterThan:(NSDate*)date;
-(BOOL) isEarlierThan:(NSDate*)date;
- (NSDate*) dateByAddingDays:(int)days;

@end

Die Umsetzung:

#import "NSDate+Util.h"


@implementation NSDate (Util)

-(BOOL) isLaterThanOrEqualTo:(NSDate*)date {
    return !([self compare:date] == NSOrderedAscending);
}

-(BOOL) isEarlierThanOrEqualTo:(NSDate*)date {
    return !([self compare:date] == NSOrderedDescending);
}
-(BOOL) isLaterThan:(NSDate*)date {
    return ([self compare:date] == NSOrderedDescending);

}
-(BOOL) isEarlierThan:(NSDate*)date {
    return ([self compare:date] == NSOrderedAscending);
}

- (NSDate *) dateByAddingDays:(int)days {
    NSDate *retVal;
    NSDateComponents *components = [[NSDateComponents alloc] init];
    [components setDay:days];

    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    retVal = [gregorian dateByAddingComponents:components toDate:self options:0];
    return retVal;
}

@end
7
Dan Rosenstark

Du solltest benutzen :

- (NSComparisonResult)compare:(NSDate *)anotherDate

um Datumsangaben zu vergleichen. In Ziel C gibt es keine Überladung der Operatoren.

6
Joris Mans

Warum benutzt ihr nicht diese NSDate Vergleichsmethoden:

- (NSDate *)earlierDate:(NSDate *)anotherDate;
- (NSDate *)laterDate:(NSDate *)anotherDate;
5
justicepenny

Ich habe fast dieselbe Situation, aber in meinem Fall prüfe ich, ob sich die Anzahl der Tage unterscheidet

NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *compDate = [cal components:NSDayCalendarUnit fromDate:fDate toDate:tDate options:0];
int numbersOfDaysDiff = [compDate day]+1; // do what ever comparison logic with this int.

Nützlich, wenn Sie das NSDate in der Einheit Tage/Monat/Jahr vergleichen müssen 

4
Andy

Sie können mit dieser Methode auch zwei Datumsangaben vergleichen

        switch ([currenttimestr  compare:endtimestr])
        {
            case NSOrderedAscending:

                // dateOne is earlier in time than dateTwo
                break;

            case NSOrderedSame:

                // The dates are the same
                break;
            case NSOrderedDescending:

                // dateOne is later in time than dateTwo


                break;

        }
1
kapil

Ich habe es ausprobiert und hoffe, dass es für dich funktioniert 

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];      
int unitFlags =NSDayCalendarUnit;      
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];     
NSDate *myDate; //= [[NSDate alloc] init];     
[dateFormatter setDateFormat:@"dd-MM-yyyy"];   
myDate = [dateFormatter dateFromString:self.strPrevioisDate];     
NSDateComponents *comps = [gregorian components:unitFlags fromDate:myDate toDate:[NSDate date] options:0];   
NSInteger day=[comps day];
0
Concept Infoway

Verwenden Sie diese einfache Funktion zum Datumsvergleich

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

BOOL isTokonValid;

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

return isTokonValid;}
0
Akhtar