2013-06-21 2 views
-2

У меня есть NSMutableArray с NSDates, некоторые даты - с того же дня. Каков наилучший способ получить количество NSDates за определенный день?NSMutableArray с записями NSDate получает количество дней

Edit:

К сожалению, я не в полной мере объяснить. Мне нужна какая-то логика для получения количества дат для определенного дня из исходного массива. Поэтому я просматриваю массив, нахожу точную дату, и мне нужно знать, сколько дней в массиве за тот же день.

+1

Петля. Что вы пробовали? Что не получилось, как вы ожидали/надеялись? – Wain

+0

Проверить исправленное сообщение PLS –

+0

Что @Wain сказал - цикл через массив и счет. Вы, конечно, сначала должны определить, что вы подразумеваете под «в тот же день». Вы можете найти это проще всего, если массив отсортирован (если это соответствует вашим другим потребностям в массиве). –

ответ

1

EDIT

NSDate *sourceDate = theDateThatYouAreLookingFor; 
NSCalendar *calendar = [NSCalendar currentCalendar]; 
[calendar setTimeZone:[NSTimeZone systemTimeZone]]; 

NSDateComponents *dateComponents = [calendar components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:sourceDate];  

NSInteger day = [dateComponents day]; 
NSInteger month = [dateComponents month]; 
NSInteger year = [dateComponents year]; 

int count = 0; 
//add check for existing dates on the same day 
for(NSDate *checkDate in datesArray) 
{ 
    dateComponents = [calendar components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:checkDate];  

    NSInteger checkDay = [dateComponents day]; 
    NSInteger checkMonth = [dateComponents month]; 
    NSInteger checkYear = [dateComponents year]; 

    if(checkDay == day && checkMonth == month && checkYear == year) 
     count++; 

} 
//do something with count 

END EDIT

Самый простой способ будет перебирать массив и сравнить день каждую дату в виде строки с использованием NSDateFormatter. Имейте в виду, что NSDateFormatters стоят дорого, поэтому вы не хотите слишком часто выполнять этот процесс.

Вы можете сделать что-то вроде этого:

NSMutableDictionary *dateInfo = [NSMutableDictionary dictionary]; 


NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; 
formatter.locale = [NSLocale currentLocale]; 
formatter.dateFormat = @"yyyyMMdd"; 

for(NSDate *date in datesArray) 
{ 
    NSString *dateStr = [formatter stringFromDate:date]; 
    NSNumber *currentCount = [dateInfo objectForKey:dateStr]; 
    if(currentCount) 
    { 
     //bump value 
     [dateInfo setObject:[NSNumber numberWithInt:currentCount.intValue + 1] forKey:dateStr]; 
    } 
    else 
    { 
     [dateInfo setObject:[NSNumber numberWithInt:1] forKey:dateStr]; 
    } 
} 
+0

Совершенно не нужно. Для этого NSDateComponents. –

+0

Я просто сделал это, чтобы иметь хороший тег для словаря. Я отредактирую свой ответ, чтобы показать, используя компоненты даты. – mrosales

+0

Отредактировано снова, чтобы лучше ответить на исправления – mrosales

1

По соображениям производительности я хотел бы создать две даты, "сегодня" (00:00:00) и "завтра" (00:00:00). Вы используете эти даты в качестве границ для сравнения. Если дата равна или больше, чем сегодня, и меньше, чем завтра, это соответствует.

Поскольку сравнение NSDate в основном является двойным (примитивным типом), этот метод будет быстрее, чем сравнение объектов NSString или NSDateComponents. Для создания NSDateComponents используется большая математика, и NSDateFormatters, вероятно, сами используют NSDateComponents.

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

NSDateComponents *todayComponents = [[NSDateComponents alloc] init]; 
todayComponents.year = 2013; 
todayComponents.month = 6; 
todayComponents.day = 21; 

// today must be at the beginning of your search day. i.e. 00:00:00 
NSDate *today = [calendar dateFromComponents:todayComponents]; 

NSDateComponents *oneDayOffset = [[NSDateComponents alloc] init]; 
oneDayOffset.day = 1; 
NSDate *tomorrow = [calendar dateByAddingComponents:oneDayOffset toDate:today options:0]; 

NSIndexSet *todaysIndexes = [array indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { 
    if ([(NSDate *)obj compare:today] != NSOrderedAscending && [(NSDate *)obj compare:tomorrow] == NSOrderedAscending) { 
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ obj is not earlier than "today" (= same time or later) 
//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ obj is earlier than "tomorrow"    
     return YES; 
    } 
    return NO; 
}]; 

NSLog(@"%d", [todaysIndexes count]); 

Замените сегодня с вашей датой поиска (в полночь), и вы готовы к работе.

+0

Хорошее решение. Единственное, что он не будет включать даты, которые относятся к одной и той же дате календаря, но ранее в тот же день. Вам нужно будет получить NSDate на сегодня в полночь и использовать затем завтра в полночь и проверить, чтобы дата была между ними. Я считаю, что это то, что вы ему говорите, но код этого не делает. – mrosales

+0

Код делает именно это. –

+0

Да, но только если вы установили dateComponents с компонентами, которые вы извлекаете с даты, которую ищете. – mrosales

Смежные вопросы