2014-01-09 4 views
0

Предполагая, что мы используем григорианскую систему календаря, какой лучший способ определить количество выходных дней, которые произошли между двумя объектами NSDate?Количество выходных дней между двумя NSDates

Мой текущий подход включает в себя разработку количества дней между двумя NSDate s, а затем деления на 7 и floor() результата. Это дает мне количество недель и, как результат, количество выходных дней. Результат floor Результат, если неделя еще не завершена (и в подразделении есть остаток), она игнорирует это и рассматривает только прошедшие недели.

Любые предложения по улучшению и надежности будут оценены по достоинству.

ответ

0

Как вы заметили, ваше решение может вернуть значение, меньшее, чем фактическое количество выходных дней.

Для учета возможных дополнительных выходных, если остаток от общего количества дней после деления на 7 больше, чем 0, то сравните количество буднего (например NSDateComponents «s weekday - что 1 в воскресенье 7 для субботы) из даты начала и окончания. Если конечный день недели меньше, чем начальный, должен быть уикенд между ними (подсчет изменения Sat/Sun в выходные дни - скорректируйте, как вы сочтете нужным).

НТН

0

Вот быстрое выполнение:

NSCalendar *cal = [NSCalendar currentCalendar]; 
NSDate *endDate = [NSDate dateWithTimeIntervalSinceNow:1209600]; 
NSDate *startDate = [NSDate date]; 
NSDateComponents *comps = [cal components:NSCalendarUnitWeekday | NSCalendarUnitDay fromDate:startDate toDate:endDate options:kNilOptions]; 
NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; 
[fmt setLocale:[NSLocale localeWithLocaleIdentifier:@"en_US"]]; 
[fmt setDateFormat:@"EEEE"]; 
NSArray *weekend = [fmt weekdaySymbols]; 
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF == 'Saturday' || SELF == 'Sunday'"]; 
NSArray *weekendArr = [weekend filteredArrayUsingPredicate:pred]; 
NSString *weekendsStr = [weekendArr componentsJoinedByString:@""]; 
NSDateComponents *compsWithDay = [[NSDateComponents alloc] init]; 
[compsWithDay setDay:1]; 
NSString *dayNameStr = [fmt stringFromDate:startDate]; 
NSUInteger count = 0; 
if ([weekendsStr rangeOfString:dayNameStr].location != NSNotFound) { 
    count++; 
} 
for (int i = 0; i < comps.day; i++) { 
    startDate = [cal dateByAddingComponents:compsWithDay toDate:startDate options:kNilOptions]; 
    dayNameStr = [fmt stringFromDate:startDate]; 
    if ([weekendsStr rangeOfString:dayNameStr].location != NSNotFound) { 
    count++; 
    } 
} 

Примечания:

  1. Этот код должен использоваться только с ARC включен
  2. Может есть избыточность, не может видеть это прямо сейчас. Но код работает правильно.
0

Попробуйте, как это, описание кода есть в комментариях: -

//Assuming this is your dates where you need to determine the weekend in between two dates 
NSString *[email protected]"10-01-2014"; 
NSString *[email protected]"19-01-2014"; 
NSDateFormatter *format=[[NSDateFormatter alloc]init]; 
[format setDateFormat:@"dd-MM-yyyy"]; 
NSDate *dt1=[format dateFromString:strDate1]; 
NSDate *dt2=[format dateFromString:strDate2]; 

//Now finding the days between two dates 
NSUInteger units = NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSWeekdayCalendarUnit; 
NSCalendar *cal = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; 
NSDateComponents *com=[cal components:units fromDate:dt1 toDate:dt2 options:0]; 
NSInteger day1=[com day]; 
int i=0; 
int j=0; 


//Now calculating how many weekends(Sat, Sun) are there in the total number of days. 
for(i=0; i<=day1; i++) 
{ 
    com=[[NSDateComponents alloc]init]; 
    [com setDay:i]; 
    NSDate *newDate = [[NSCalendar currentCalendar] 
         dateByAddingComponents:com 
         toDate:dt1 options:0]; 
    [format setDateFormat:@"EEE"]; 
    NSString *satSun=[format stringFromDate:newDate]; 
    if ([satSun isEqualToString:@"Sat"] || [satSun isEqualToString:@"Sun"]) 
    { 
     j++; 

    } 
} 
     NSLog(@"Total number of weekends found= %d",j); 
Смежные вопросы