Установите для дней NSDates такое же значение

Я хочу сравнить 2 конкретных дня, но я хочу сравнить месяц и год, а не дни. Например, у меня есть одна дата, например, 2016-08-16, и другая дата, например, 2016-08-10, мне нужно сравнить даты и получить равенство, потому что их месяцы равны.

Следовательно, мне нужен способ сделать оба NSDates равными днями, поэтому мне нужно сделать 2016-08-10 как 2016-08-00. После этого я также могу изменить вторую дату и провести сравнение.

У меня есть простой фрагмент кода для равенства, но я полагаю, он также учитывает дни, часы и т. Д.:

 if ([dateOld compare:dateNew] == NSOrderedDescending) {
        NSLog(@"date1 is later than date2");
    } else if ([dateOld compare:dateNew] == NSOrderedAscending) {
        NSLog(@"date1 is earlier than date2");
    } else {
        NSLog(@"dates are the same");
    }

Для работы мне нужны «нулевые» дни и время NSDates. Есть ли способ сделать это?


person Evgeniy Kleban    schedule 03.08.2016    source источник
comment
NSDateComponents ссылка на класс: developer.apple.com/library/mac/documentation/Cocoa/Reference/   -  person Robotic Cat    schedule 03.08.2016
comment
NSDateComponents, но также NSCalendar, с методом compareDate:toDate:toUnitGranularity: может быть тем, что вы ищете.   -  person Larme    schedule 03.08.2016
comment
@Larme, не могли бы вы привести пример?   -  person Evgeniy Kleban    schedule 03.08.2016
comment
Я думаю, что быстрый поиск по ключевым словам, которые я дал (имена классов, имя метода) и сравнение, должны дать вам быстрый пример SO, подобный этому: stackoverflow.com/questions/1854890/   -  person Larme    schedule 03.08.2016
comment
@Larme, ладно, спасибо.   -  person Evgeniy Kleban    schedule 03.08.2016


Ответы (2)


См. Этот ответ SO: Сравнение определенных компонентов NSDate?

NSCalendar *calendar = [NSCalendar currentCalendar];
NSInteger desiredComponents = (NSMonthCalendarUnit | NSYearCalendarUnit);

NSDate *firstDate = ...; // one date
NSDate *secondDate = ...; // the other date

NSDateComponents *firstComponents = [calendar components:desiredComponents fromDate:firstDate];
NSDateComponents *secondComponents = [calendar components:desiredComponents fromDate:secondDate];

NSDate *truncatedFirst = [calendar dateFromComponents:firstComponents];
NSDate *truncatedSecond = [calendar dateFromComponents:secondComponents];

NSComparisonResult result = [truncatedFirst compare:truncatedSecond];
if (result == NSOrderedAscending) {
  //firstDate is before secondDate
} else if (result == NSOrderedDescending) {
  //firstDate is after secondDate
}  else {
  //firstDate is the same month/year as secondDate
}
person A O    schedule 03.08.2016
comment
@A О хорошо, я попробую сейчас - person Evgeniy Kleban; 03.08.2016
comment
NSMonthCalendarUnit и NSYearCalendarUnit - person A O; 03.08.2016
comment
Это почти тот же ответ. Было бы лучше пометить вопрос как дубликат, с возможностью комментировать его с помощью флага NSCalendarUnit, который будет установлен в особом случае. - person Larme; 03.08.2016

Если у вас две даты,

NSDate *now = // some date
NSDate *other = // some other date

Вы можете сделать это сравнение как:

if ([[NSCalendar currentCalendar] compareDate:now toDate:other toUnitGranularity:NSCalendarUnitMonth] == NSOrderedSame) {
    NSLog(@"Same month");
} else {
    NSLog(@"Different month");
}
person Tom Harrington    schedule 03.08.2016