Как сравнить две даты (даты только; не время) в какао?

В основном я хочу выяснить, на ли следующий день это. Так, я храню текущую дату (например, Jan 2) постоянно в plist. Но в следующий раз пользователь открывает приложение, если дата изменилась (например, Jan 3), я хочу сделать что-то. Обратите внимание, что простая проверка порядка по возрастанию не работала бы, потому что я не хочу знать, позже ли одна дата, чем другая дата, если различие находится только в течение многих часов. Я должен быть в состоянии дифференцировать Jan 2 11:50 и Jan 3 2:34, но не Jan 3 2:34 и Jan 3 5:12.

9
задан abiraja 3 January 2010 в 11:34
поделиться

3 ответа

Я использую следующее, что я нашел 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];
}
24
ответ дан 4 December 2019 в 10:04
поделиться

Используйте NSCalendarDate вместо NSDate, и сравните, что они возвращают из -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
-2
ответ дан 4 December 2019 в 10:04
поделиться

Взглянув на Date Time Programming Guide, вы можете получить пример того, как вычислить разницу между двумя датами по компонентам: например:

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];
0
ответ дан 4 December 2019 в 10:04
поделиться