158 votes

Comment déterminer si un NSDate est aujourd'hui?

Comment vérifier si un NSDate appartient aujourd'hui?

J'avais l'habitude de le vérifier en utilisant les 10 premiers caractères de [aDate description] . [[aDate description] substringToIndex:10] renvoie une chaîne semblable à "YYYY-MM-DD" . J'ai donc comparé la chaîne à la chaîne renvoyée par [[[NSDate date] description] substringToIndex:10] .

Y at-il plus moyen rapide et / ou soigné de vérifier?

Merci.

313voto

Catfish_Man Points 15439

Dans Mac OS X 10.9 et iOS 8, il existe une méthode sur NSCalendar qui fait exactement cela!

 - (BOOL)isDateInToday:(NSDate *)date 
 

Donc, vous feriez simplement:

 BOOL today = [[NSCalendar currentCalendar] isDateInToday:date];
 

192voto

David Kanarek Points 8816

Vous pouvez comparer les composants de date:

NSDateComponents *otherDay = [[NSCalendar currentCalendar] components:NSEraCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:aDate];
NSDateComponents *today = [[NSCalendar currentCalendar] components:NSEraCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
if([today day] == [otherDay day] &&
   [today month] == [otherDay month] &&
   [today year] == [otherDay year] &&
   [today era] == [otherDay era]) {
    //do stuff
}

Edit:

J'aime stefan la méthode de plus, je pense que cela rend plus propre et plus compréhensible si l'énoncé:

NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:(NSEraCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:[NSDate date]];
NSDate *today = [cal dateFromComponents:components];
components = [cal components:(NSEraCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:aDate];
NSDate *otherDate = [cal dateFromComponents:components];

if([today isEqualToDate:otherDate]) {
    //do stuff
}

Chris, j'ai intégré votre suggestion. J'ai eu à le regarder jusqu'à quelle époque a été, donc, pour quelqu'un d'autre qui ne le connaissent pas, il fait la distinction entre BC et AD. Ceci est probablement inutile pour la plupart des gens, mais il est facile de vérifier et ajoute un certain degré de certitude, donc je l'ai inclus. Si vous allez pour la vitesse, ce n'est probablement pas une bonne méthode, de toute façon.

28voto

Jon Points 2102

Ceci est une ramification de votre question, mais si vous souhaitez imprimer un NSDate avec "Aujourd'hui" ou "Hier", utilisez la fonction

 - (void)setDoesRelativeDateFormatting:(BOOL)b
 

pour NSDateFormatter

16voto

stefanB Points 27796

Je voudrais essayer d'obtenir la date d'aujourd'hui normalisée à minuit et la deuxième date, normaliser à minuit puis comparer si c'est le même NSDate.

À partir d' un exemple Apple, voici comment vous normalisez la date d'aujourd'hui à minuit, procédez de la même manière pour la deuxième date et comparez:

 NSCalendar * gregorian = [[NSCalendar alloc]
                               initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents * components =
    [gregorian components:
                 (NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit)
                 fromDate:[NSDate date]];
NSDate * today = [gregorian dateFromComponents:components];
 

12voto

vikingosegundo Points 30323

Pas besoin de jongler avec des composants, des époques et des choses.

NSCalendar fournit une méthode pour obtenir le début d'une certaine unité de temps pour une date existante.

Ce code aura le début d'aujourd'hui et une autre date et comparera cela. S'il est évalué à NSOrderedSame , les deux dates ont lieu le même jour - donc aujourd'hui.

 NSDate *today = nil;
NSDate *beginningOfOtherDate = nil;

NSDate *now = [NSDate now];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&today interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&beginningOfOtherDate interval:NULL forDate:otherDate];

if([today compare:beginningOfOtherDate] == NSOrderedSame) {
    //otherDate is a date in the current day
}
 

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