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.
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 .
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.
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.
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:
NSOrderedSame
NSOrderedDescending
NSOrderedAscending
.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
- (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.
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
Du solltest benutzen :
- (NSComparisonResult)compare:(NSDate *)anotherDate
um Datumsangaben zu vergleichen. In Ziel C gibt es keine Überladung der Operatoren.
Warum benutzt ihr nicht diese NSDate
Vergleichsmethoden:
- (NSDate *)earlierDate:(NSDate *)anotherDate;
- (NSDate *)laterDate:(NSDate *)anotherDate;
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
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;
}
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];
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;}