web-dev-qa-db-fra.com

iOS: comparer deux dates

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?

96
CrazyDev

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]) ...

Voir Documentation Apple à propos de celui-ci .

210
Vincent Guerci

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!


Modifier 1

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];
32
Yossi Tsafar

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

23

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];
}
16
Matthias Bauch

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
} 
2
JeremyP

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 :)

2
Akhtar