J'ai besoin de savoir si deux instances NSDate sont toutes deux du même jour.
Existe-t-il un moyen plus facile/meilleur de le faire que de récupérer les composants NSDate et de comparer le jour/mois/année ?
J'ai besoin de savoir si deux instances NSDate sont toutes deux du même jour.
Existe-t-il un moyen plus facile/meilleur de le faire que de récupérer les composants NSDate et de comparer le jour/mois/année ?
Si vous ciblez iOS 8 (et OS X 10.9) ou version ultérieure entonces La réponse de Joe est une meilleure solution en utilisant une nouvelle méthode dans NSCalendar juste à cet effet :
-[NSCalendar isDate:inSameDayAsDate:]
Pour iOS 7 ou antérieur : NSDateComponents est ma préférence. Que diriez-vous de quelque chose comme ça ?
- (BOOL)isSameDayWithDate1:(NSDate*)date1 date2:(NSDate*)date2 {
NSCalendar* calendar = [NSCalendar currentCalendar];
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents* comp1 = [calendar components:unitFlags fromDate:date1];
NSDateComponents* comp2 = [calendar components:unitFlags fromDate:date2];
return [comp1 day] == [comp2 day] &&
[comp1 month] == [comp2 month] &&
[comp1 year] == [comp2 year];
}
(Remarque : consultez la réponse de Joe pour connaître la bonne façon de procéder sous iOS 8+).
J'utilise simplement un formateur de date :
NSDateFormatter *dateComparisonFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateComparisonFormatter setDateFormat:@"yyyy-MM-dd"];
if( [[dateComparisonFormatter stringFromDate:firstDate] isEqualToString:[dateComparisonFormatter stringFromDate:secondDate]] ) {
…
}
HTH.
J'aime la solution de progrmr, mais j'irais encore plus loin et je ferais une catégorie de NSDate
qui fournit cette méthode. Cela rendra votre code légèrement plus lisible, et vous n'aurez pas besoin de copier et coller la méthode dans chaque nouvelle classe qui pourrait en avoir besoin - importez simplement le fichier d'en-tête.
@interface NSDate (SameDay)
- (BOOL)isSameDayAsDate:(NSDate*)otherDate;
@end
#import "NSDate+SameDay.h"
@implementation NSDate (SameDay)
- (BOOL)isSameDayAsDate:(NSDate*)otherDate {
// From progrmr's answer...
NSCalendar* calendar = [NSCalendar currentCalendar];
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents* comp1 = [calendar components:unitFlags fromDate:self];
NSDateComponents* comp2 = [calendar components:unitFlags fromDate:otherDate];
return [comp1 day] == [comp2 day] &&
[comp1 month] == [comp2 month] &&
[comp1 year] == [comp2 year];
}
@end
Ensuite, après avoir importé NSDate+SameDay.h
dans votre classe, vous pouvez l'utiliser comme suit :
if ([myFirstDate isSameDayAsDate:mySecondDate]) {
// The two dates are on the same day...
}
NSDateComponents me semble être la meilleure solution. Une autre tactique à essayer est de la relier à une CFDate, puis d'utiliser CFDateGetAbsoluteTime et d'effectuer une soustraction pour obtenir le temps qui sépare les deux dates. Vous devrez cependant faire quelques calculs supplémentaires pour déterminer si la différence de temps fait que les dates se trouvent le même jour.
J'utilise NSDateComponents pour supprimer l'aspect temporel et ensuite comparer. Quelque chose comme :
if ([[self beginningOfDay:date1] isEqualToDate:[self beginningOfDay:date2]])
{
...
}
- (NSDate *)beginningOfDay:(NSDate *)date {
NSCalendar *calendar = [NSCalendar currentCalendar];
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *comp = [calendar components:unitFlags fromDate:date];
return [calendar dateFromComponents:comp];
}
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.