Come confrontare due NSD: Qual è più recente?

Sto cercando di ottenere una sincronizzazione dropBox e ho bisogno di confrontare le date di due file. Uno è sul mio account DropBox e uno è sul mio iPhone.

Sono arrivato con il seguente, ma ottengo risultati inaspettati. Credo che sto facendo qualcosa di fondamentalmente sbagliato quando si confrontano le due date. Ho semplicemente usato gli operatori> <, ma immagino che non vada bene perché sto confrontando due stringhe NSDate. Eccoci qui:

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."); } 

Questo mi ha dato il seguente output (casuale e sbagliato):

 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. 

o questo che sembra essere corretto:

 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. 

Assumiamo due date:

 NSDate *date1; NSDate *date2; 

Quindi il seguente confronto indicherà quale è precedente / successivo / uguale:

 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"); } 

Fare riferimento alla documentazione della class NSDate per ulteriori dettagli.

In ritardo per la festa, ma un altro modo semplice per confrontare gli oggetti NSDate è convertirli in tipi primitivi che consentono un facile uso di ‘>’ ‘<' '==' ecc.

per esempio.

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

timeIntervalSinceReferenceDate converte la data in secondi dalla data di riferimento (1 gennaio 2001, GMT). Poiché timeIntervalSinceReferenceDate restituisce un NSTimeInterval (che è un typedef doppio), possiamo utilizzare i confronti primitivi.

In Swift, puoi sovraccaricare gli operatori esistenti:

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

Quindi, è ansible confrontare direttamente NSDates con < , > e == (già supportato).

NSDate ha una funzione di confronto.

compare: restituisce un valore NSComparisonResult che indica l’ordinamento temporale del destinatario e un’altra data specifica.

 (NSComparisonResult)compare:(NSDate *)anotherDate 

Parametri : anotherDate La data con cui confrontare il ricevitore. Questo valore non deve essere nulla. Se il valore è zero, il comportamento non è definito e potrebbe cambiare nelle versioni future di Mac OS X.

Valore di ritorno:

  • Se il ricevitore e un altro Data sono esattamente uguali tra loro, NSOrderedSame
  • Se il ricevitore è più tardi nel tempo di un altro appuntamento, NSOrderedDescending
  • Se il ricevitore è precedente nel tempo rispetto ad un altro Data, NSOrderedAscending .

Si desidera utilizzare il confronto NSDate :, afterData :, data precedente :, o isEqualToDate: metodi. L’utilizzo degli operatori in questa situazione sta confrontando i puntatori e non le date

 - (NSDate *)earlierDate:(NSDate *)anotherDate 

Ciò restituisce il precedente del ricevitore e un altro Data. Se entrambi sono uguali, il ricevitore viene restituito.

Alcune utilità di data, compresi i confronti IN INGLESE, che è bello:

 #import  @interface NSDate (Util) -(BOOL) isLaterThanOrEqualTo:(NSDate*)date; -(BOOL) isEarlierThanOrEqualTo:(NSDate*)date; -(BOOL) isLaterThan:(NSDate*)date; -(BOOL) isEarlierThan:(NSDate*)date; - (NSDate*) dateByAddingDays:(int)days; @end 

L’implemento:

 #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 

Dovresti usare :

 - (NSComparisonResult)compare:(NSDate *)anotherDate 

confrontare le date Non c’è sovraccarico dell’operatore nell’objective C.

Ho incontrato quasi la stessa situazione, ma nel mio caso sto controllando se il numero di giorni di differenza

 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. 

Utile quando è necessario confrontare NSDate in unità Giorni / Mese / Anno

Perché voi ragazzi non usate questi metodi di confronto NSDate :

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

È anche ansible confrontare due date con questo metodo

  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; } 

Ho provato a sperare che funzioni per te

 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]; 

Utilizzare questa semplice funzione per il confronto delle date

 -(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;}