245 votes

Comment comparer deux NSDates: Lequel est le plus récent?

Je suis en train de réaliser un dropBox sync et de la nécessité de comparer les dates des deux fichiers. L'un est sur mon compte dropBox et est sur mon iPhone.

Je suis venu avec la suite, mais j'obtiens des résultats inattendus. Je suppose que je suis en train de faire quelque chose de fondamentalement mauvais lorsque l'on compare les deux dates. J'ai simplement utilisé l' > < opérateurs, mais je suppose que ce n'est pas bon comme je suis de la comparaison de deux NSDate cordes. Ici, nous allons:

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

Cela m'a donné la suivante (aléatoire et mal) de sortie:

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.

ou ce qui arrive à être correct:

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.

662voto

Nick Weaver Points 30418

Supposons deux dates:

 NSDate *date1;
NSDate *date2;
 

Ensuite, la comparaison suivante dira qui est plus tôt / plus tard / même:

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

Reportez-vous à la documentation de la classe NSDate pour plus de détails.

50voto

So Over It Points 969

En retard à la partie, mais un autre moyen facile de comparer les objets NSDate est de les convertir en types primitifs, ce qui permet une utilisation facile de '>' '<' '==' etc

par exemple.

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

timeIntervalSinceReferenceDate convertit la date en secondes depuis la date de référence (1er janvier 2001, GMT). Comme timeIntervalSinceReferenceDate renvoie un NSTimeInterval (qui est un double typedef), nous pouvons utiliser des comparateurs primitifs.

13voto

Gary Points 2115

NSDate a une fonction de comparaison.

compare: Renvoie un NSComparisonResult valeur qui indique l'ordre temporel du récepteur et l'autre date donnée.

(NSComparisonResult)compare:(NSDate *)anotherDate

Paramètres: anotherDate La date à laquelle comparer le récepteur. Cette valeur ne doit pas être nul. Si la valeur est nulle, le comportement est indéfini, et peut changer dans les futures versions de Mac OS X.

Valeur De Retour:

  • Si le récepteur et anotherDate sont exactement égaux les uns aux autres, NSOrderedSame
  • Si le récepteur est plus tard dans le temps que anotherDate, NSOrderedDescending
  • Si le récepteur est plus tôt que le anotherDate, NSOrderedAscending.

12voto

Dan F Points 11380

Vous voulez utiliser les méthodes NSDate compare :, laterDate :, earlierDate :, isEqualToDate:. Utiliser les opérateurs <et> dans cette situation compare les pointeurs, pas les dates

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X