2013-11-02 3 views
2

По существу у меня есть функция чаевых с конкретными подсказками, связанными с датами, и мне нужен способ сравнить текущий NSDate с сохраненной датой для подсказки, независимо от времени. Очевидно, что совет на 1 января актуальен в 10 утра и 10:30, поэтому я не могу буквально сравнить NSDates. Вот некоторые из вещей, которые я пробовал:Сравнение NSDates без учета времени

Попробуйте 1 - Не работает

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]]; 
NSInteger day = [components day]; 
NSInteger month = [components month]; 
NSInteger year = [components year]; 

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
// [df setDateFormat:@"yyyy-MM-dd hh:mm:ss a"]; 
[df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"]; 

Попробуйте 2 - Не работает

NSString * zoneString = [[NSString stringWithFormat:@"%i-%i-%iT00:00:00", year, month, day] substringFromIndex:([[NSString stringWithFormat:@"%i-%i-%iT00:00:00", year, month, day] length] - 5)]; 
NSTimeInterval timeInterval = [[zoneString substringToIndex:3] intValue] * 3600; 
timeInterval += [[zoneString substringFromIndex:3] intValue] * 60; 

NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; 
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:timeInterval]]; 
[formatter setDateFormat:@"yyyy'-'MM'-'dd' 'HH':'mm':'ss ZZZ"]; 
NSLog(@"%@", [formatter stringFromDate:myDate]); 

Попробуйте 3 - Не работает

NSDate *date = [NSDate date]; 
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&date interval:NULL forDate:date]; 

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"yyyy-MM-dd"]; 

if ([[dateFormat stringFromDate:date] isEqualToString:[dateFormat stringFromDate:tipDate]]) 
+0

знакомства Gabriele в ниже. У меня есть аналогичное требование в приложении, чтобы проверить, произошло ли какое-либо событие (основанное на времени) в одну и ту же дату календаря, и это именно то, как я это делаю. Просто сравните по дате компоненты, соответствующие году, месяца и дня. – Bladebunny

+0

Я проверил этот вопрос перед публикацией, и решения не работали. – Andrew

ответ

1

Как правило, при сравнении или манипулировании NSDate с правильным инструментом для задания обычно является комбинация NSCalendar и NSDateComponents.

Используйте NSDateFormatter только тогда, когда вам нужно форматировать и отображать NSDate.

С учетом этого NSDateComponents - это путь, так как вы хотите сравнить подмножество компонентов из двух дат.

Создайте два экземпляра NSDateComponents и сравнивайте их.

Пример: ответ

- (BOOL)isToday:(NSDate *)date { 
    NSDateComponents *todayComponents = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit 
                     fromDate:[NSDate date]]; 
    NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit 
                     fromDate:date]; 
    return [dateComponents isEqual:todayComponents]; 
} 
+0

@downvoter, чтобы объяснить, что случилось с моим ответом, чтобы я мог его улучшить? –