iPhone iOS NSDate, как определить, включает ли диапазон дат начало месяца?

У меня есть набор событий, которые я показываю в UITableView. Каждое событие имеет дату начала и дату окончания с интервалом 1-3 дня между ними.

Я пытаюсь определить, включает ли конкретный диапазон дат начало месяца (например, 1 августа), и добавить специальный маркер в эту ячейку представления таблицы.

Я читал, что NSDate и манипуляции с календарем являются дорогостоящими операциями, а мое табличное представление уже не самое быстрое в мире. Как я могу эффективно определить, включает ли диапазон дат начало месяца?


person Alex Stone    schedule 29.06.2012    source источник
comment
возможный дубликат Как проверить, происходит ли NSDate между двумя другими NSDates   -  person jscs    schedule 29.06.2012


Ответы (3)


Ну, подумав прагматично, можно проверить месяцы каждой даты:

NSCalendar* calendar = [NSCalendar currentCalendar];

NSDateComponents* startComp = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:startDate];

NSDateComponents* endComp = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:endDate];

if([startComp month] != [endComp month]){
    // start of month included
}

Вы можете сделать то же самое для дней, и если значение endDate дня МЕНЬШЕ, чем значение startDate дня, то вы знаете, что где-то там есть 1-й день. Очевидно, что этот способ будет работать правильно, только если события охватывают менее месяца (что, как вы сказали, так и есть).

person Thomas Clayson    schedule 29.06.2012

Проверьте значения месяца двух конечных дат, если они разные, у вас есть начало месяца, иначе у вас его нет.

Изменить: сначала проверьте, что значение дня даты любой конечной точки (начала или окончания) равно 1.

person rad    schedule 29.06.2012
comment
Плюс случай, когда месяц одинаковый, но одна из дат первая. - person Alexander; 29.06.2012
comment
Возможно, сначала проверьте, равно ли значение дня 1 :) - person rad; 29.06.2012

Вы можете проверить, меньше ли дата окончания, чем дата начала.

Например: начало = 30 июня, конец = 2 июля.

NSDate * start, end;

NSInteger startDay = [[start descriptionWithCalendarFormat:@"%d" timeZone:nil locale:nil] intValue];
NSInteger endDay = [[start descriptionWithCalendarFormat:@"%d" timeZone:nil locale:nil] intValue];

if (endDay < startDay) {
    // bingo!
}
person Alessandro Vendruscolo    schedule 29.06.2012
comment
@rad значение ДНЯ даты окончания выше, чем дата начала, так что это сработает. :) - person Thomas Clayson; 29.06.2012
comment
встречный пример start=1 июня end=3 июня - person rad; 29.06.2012