J'ai un NSDate
que je dois comparer avec deux autres NSDate
et j'essaie avec NSOrderAscending
et NSOrderDescending
mais si ma date est égale à deux autres dates?
Exemple: si j'ai un myDate = 24/05/2011
et deux autres qui sont un = 24/05/2011
et deux 24/05/2011
que puis-je utiliser?
Selon documentation Apple de NSDate compare:
Renvoie une valeur NSComparisonResult qui indique l'ordre temporel du destinataire et une autre date donnée.
- (NSComparisonResult)compare:(NSDate *)anotherDate
Paramètres
anotherDate
La date à laquelle comparer le destinataire. Cette valeur ne doit pas être nulle. Si la valeur est nil, le comportement n'est pas défini et pourrait changer dans les futures versions de Mac OS X.
Valeur de retour
Si:
Le destinataire et anotherDate sont exactement égaux,
NSOrderedSame
Le destinataire est plus tardif que anotherDate,
NSOrderedDescending
Le destinataire est plus tôt que anotherDate,
NSOrderedAscending
En d'autres termes:
if ([date1 compare:date2] == NSOrderedSame) ...
Notez qu'il pourrait être plus facile dans votre cas particulier de lire et d'écrire ceci:
if ([date2 isEqualToDate:date2]) ...
Après de nombreuses recherches sur stackoverflow et sur le Web, je dois conclure que la meilleure façon de le faire est la suivante:
- (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;
}
Vous pouvez également changer la différence entre les heures.
Prendre plaisir!
Si vous souhaitez comparer la date avec le format jj/mm/aaaa uniquement, vous devez ajouter les lignes ci-dessous entre NSDate* currentdate = [NSDate date];
&& NSTimeInterval 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];
Je suppose que vous demandez quelle est la valeur de retour dans la fonction de comparaison.
Si les dates sont égales, renvoyer NSOrderedSame
Si croissant (2ème argument> 1er argument), retourne NSOrderedAscending
Si décroissant (2nd arg <1st arg), retournez NSOrderedDescending
Je ne sais pas exactement si vous avez posé cette question, mais si vous souhaitez uniquement comparer le composant de date d'un NSDate, vous devez utiliser NSCalendar et NSDateComponents pour supprimer le composant d'heure.
Quelque chose comme ça devrait fonctionner comme une catégorie pour NSDate:
- (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];
}
NSDate
représente en fait un intervalle de temps en secondes depuis une date de référence (1er janvier 2000, je pense). En interne, un nombre à virgule flottante en double précision est utilisé, de sorte qu'il est très peu probable que deux dates arbitraires se comparent, même si elles se déroulent le même jour. Si vous voulez voir si une date particulière tombe un jour particulier, vous devrez probablement utiliser NSDateComponents
. par exemple.
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
}
Vérifiez la fonction suivante pour comparer les dates tout d’abord, créez deux objets NSDate et transmettez-les à la fonction: Ajoutez les lignes ci-dessous de code dans viewDidload ou selon votre scénario.
-(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];}
voici la fonction
-(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;}
Changez simplement la date et testez la fonction ci-dessus :)