Есть ли более простой / лучший способ сделать это, чем получить NSDateComponents и сравнить день / месяц / год?
Да, есть более простой способ
-[NSCalendar rangeForUnit:startDate:interval:forDate:]
Этот метод позволяет легко установить дату начала единицы (день, час, месяц, год, ...) и получить длину (интервал) этой единицы.
В качестве категории может использоваться как
@interface NSDate (Comparison)
-(BOOL) isSameDay:(NSDate *)rhs;
@end
@implementation NSDate (Comparison)
-(BOOL)isSameDay:(NSDate *)rhs
{
NSDate *lhs = self;
NSDate *lhsStart;
NSDate *rhsStart;
NSCalendar *cal = [NSCalendar currentCalendar];
[cal rangeOfUnit:NSCalendarUnitDay startDate:&lhsStart interval:NULL forDate:lhs];
[cal rangeOfUnit:NSCalendarUnitDay startDate:&rhsStart interval:NULL forDate:rhs];
return [lhsStart compare:rhsStart] == NSOrderedSame;
}
@end
Эта категория должна работать для всех версий iOS и Mac OS X 10.5 +.
для iOS 8+ и Mac OS X 10.9+, вы можете использовать NSCalendars
- (BOOL)isDate:(NSDate *)date1 equalToDate:(NSDate *)date2 toUnitGranularity:(NSCalendarUnit)unit;