How to compare two dates(dates only; not time) in cocoa?
Basically, I want to figure out if it's the next day. So, I'm storing the current date (e.g. Jan 2) constantly in开发者_开发技巧 a plist. But the next time the user opens the application, if the date has changed (e.g. Jan 3), I want to do something. Note that a simple ascending order check wouldn't work because I don't want to know if one date is later than another date, if the difference is only in hours. I need to be able to differentiate Jan 2 11:50 and Jan 3 2:34 but not Jan 3 2:34 and Jan 3 5:12.
I use the following that I found SO:
- (BOOL)isSameDay:(NSDate*)date1 otherDay:(NSDate*)date2 {
NSCalendar* calendar = [NSCalendar currentCalendar];
unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
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];
}
Looking at the Date Time Programming Guide gives you an example of how to calculate the difference between two dates as by component: for example:
NSDate *startDate = ...;
NSDate *endDate = ...;
NSCalendar *gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
NSUInteger unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *components = [gregorian components:unitFlags
fromDate:startDate
toDate:endDate options:0];
NSInteger months = [components month];
NSInteger days = [components day];
My version based off Neils' (warning: untested):
Mine is more similar to - (NSComparisonResult)compare:
on NSDate. To check for days being equal, do [myDate compareDayMonthAndYear:otherDate] == NSOrderedSame
- (NSComparisonResult)compareDayMonthAndYear:(NSDate *)date
{
NSCalendar *calendar = [NSCalendar currentCalendar];
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *selfComponents = [calendar components:unitFlags fromDate:self];
NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:date];
BOOL dayIsEqual = (selfComponents.day == dateComponents.day && selfComponents.month == dateComponents.month && selfComponents.year == dateComponents.year);
if (dayIsEqual) {
return NSOrderedSame;
}
return [self compare:date];
}
Use NSCalendarDate instead of NSDate, and compare what they return from -dayOfCommonEra
@implementation NSDate (sameDayOrNot)
- (BOOL) sameDayAsDate:(NSDate *) otherDate
{
NSCalendarDate *date1 = [[NSCalendarDate alloc] initWithTimeInterval:0 sinceDate:self];
NSCalendarDate *date2 = [[NSCalendarDate alloc] initWithTimeInterval:0 sinceDate:otherDate];
BOOL result = ([date1 dayOfCommonEra] == [date2 dayOfCommonEra]);
[date1 release];
[date2 release];
return result;
}
@end
精彩评论