web-dev-qa-db-fra.com

Comment comparer deux objets NSDate dans l'objectif C

J'ai des objets de type Date ..

Donc, je veux les comparer, et j'ai écrit une condition si de la manière suivante ci-dessous

if(([startDate1 isEqualToDate:[self getDefaultDate]]) || (startDate1 != [ self getDefaultDate] && m_selectedDate >= m_currentDate1 && cycleStopped))
 {

///execute some condition

}

Donc, si j'ai raison ou tort .. dans cette approche?

Une dernière chose à savoir si redresser cette voie est la bonne

if(dtdate > [m_array objectatIndex:i]
{

}

Parce que j'obtiens un comportement aléatoire ..

Alors aidez-moi, s'il vous plaît, amis et geeks

Cordialement Ranjit

30
Ranjit

Voici un exemple utilisant la méthode NSDate, compare:

if([startDate compare: endDate] == NSOrderedDescending) // if start is later in time than end
{
    // do something
}

De la référence de classe:

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.

Vous pouvez également utiliser la méthode timeIntervalSinceDate: si vous souhaitez comparer deux dates et rechercher les secondes qui les séparent, par exemple.

MODIFIER:

if(([startDate1 compare:[self getDefaultDate]] == NSOrderedSame) || ([startDate1 compare: [self getDefaultDate]] != NSOrderedSame && (([m_selectedDate compare: m_currentDate1] == NSOrderedDescending) || [m_selectedDate compare: m_currentDate1] == NSOrderedSame) && cycleStopped))
74
Luke

Un moyen facile de comparer NSDates (trouvé ici http://webd.fr/637-comparer-deux-nsdate ):

#import <Foundation/Foundation.h>

@interface NSDate (Compare)

-(BOOL) isLaterThanOrEqualTo:(NSDate*)date;
-(BOOL) isEarlierThanOrEqualTo:(NSDate*)date;
-(BOOL) isLaterThan:(NSDate*)date;
-(BOOL) isEarlierThan:(NSDate*)date;
//- (BOOL)isEqualToDate:(NSDate *)date; already part of the NSDate API

@end

Et la mise en place:

#import "NSDate+Compare.h"

@implementation NSDate (Compare)

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

@end

Simple à utiliser:

if([aDateYouWant ToCompare isEarlierThanOrEqualTo:[NSDate date]]) // [NSDate date] is now
{
    // do your thing ...
}

Prendre plaisir

19
Pascal

Je dois admettre que je trouve la "comparaison" des affaires == NSWhatHaveYou trop compliquée à retenir (même si elle est correcte et qu'elle fonctionne). NSDate a deux autres méthodes que mon cerveau trouve beaucoup plus faciles à traiter: tôtDate et laterDate.

Considère ceci:

if ([myDate laterDate:today] == myDate) {
    NSLog(@"myDate is LATER than today");
} else {
    NSLog(@"myDate is EARLIER than today");
}

// likewise:
if ([myDate earlierDate:today] == myDate) {
    NSLog(@"myDate is EARLIER than today");
} else {
    NSLog(@"myDate is LATER than today");
}

L'une ou l'autre méthode retourne un objet NSDate, qui est plus tôt ou plus tard que l'autre.

http://pinkstone.co.uk/how-to-compare-two-nsdates/

4
Jay Versluis

J'ai bien aimé la réponse de Luke, et ça a fonctionné à merveille. 

J'ai utilisé quelque chose comme ça:

If ([enteredDate compare: [NSDate Date]]== NSOrderedSame || NSOrderedDescending)
{
 //Do Something if the enteredDate is later or the same as today
}else
{
//if the enteredDate is before today's date
}

Je ne suis pas sûr que cela aide, mais je tiens à répéter ce que Luke avait écrit.

3
Septronic

C'est un moyen simple de vérifier si la date que vous pensez est plus grande (par exemple, à l'avenir) par rapport à la date que vous pensez être plus tôt. Voici ce que cela fait.

  1. Obtient l'intervalle de temps (secondes et frac secondes) de la date actuelle et future
  2. renvoie vrai si la date de votre test est supérieure (référence de temps) à l'autre date

Voici

- (BOOL)isDateGreaterThanDate:(NSDate*)greaterDate and:(NSDate*)lesserDate{

    NSTimeInterval greaterDateInterval = [greaterDate timeIntervalSince1970];
    NSTimeInterval lesserDateInterval = [lesserDate timeIntervalSince1970];

    if (greaterDateInterval > lesserDateInterval) 
        return YES;

    return NO;
}

Cela fonctionne aussi

BOOL *isGreaterDateTruelyGreater = [greaterDate timeIntervalSince1970] > [lesserDate timeIntervalSince1970];

La façon dont objective-c traite les dates est moins qu'intuitive. Fondamentalement, vous pouvez utiliser NSTimeInterval pour obtenir le nombre de secondes à partir d'un instant donné. Il donne généralement un nombre long, par exemple, au moment où j'écris ceci, 1351026414.640865 correspond à l'intervalle de temps à partir de 1970. 

Point dans le temps> Point dans le temps

1
Nelson Brian
0
cREcker