2014-01-16 2 views
4

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

Например: Я хочу, сколько раз 16-го числа каждого месяца прошло между 21-21-2011 года по 5-15-2013. В этом случае это будет 17.

У меня было труднее всего понять это. Единственный способ, которым я знаю, как это сделать, - написать кучу утверждений о том, сколько лет прошло, сколько прошло месяцев, и т. Д. Есть ли более быстрый способ, например, с NSDate или что-то еще?

+3

Нет, я думаю, вам придется перебирать с даты начала и до дата окончания, увеличивая месяцы/годы через объект NSDateComponents, который будет использоваться для создания сравнения 'NSDate' (16 января 2011 года, 16 февраля 2011 года ... 16 января 2012 года и т. д.). – trojanfoe

ответ

2

ОК, вот gist из рабочего примера. Внутренности код:

const NSCalendarUnit units = NSEraCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSCalendarCalendarUnit|NSTimeZoneCalendarUnit; 
NSDateComponents *comps = [calendar components:units 
             fromDate:startDate]; 
if ([comps day] > wantDay) 
    nextMonth(comps);  // Missed the first month 
[comps setDay:wantDay]; 

NSInteger count = 0; 
while (YES) { 
    NSDate *compareDate = [calendar dateFromComponents:comps]; 
    if (!compareDate) { 
     NSLog(@"Failed to create compare date"); 
     return 5; 
    } 
    NSLog(@"Comparing %@", [formatter stringFromDate:compareDate]); 
    if ([compareDate compare:endDate] == NSOrderedDescending) 
     break; 
    count++; 
    nextMonth(comps); 
} 

Где nextMonth() является:

static void nextMonth(NSDateComponents *comps) { 
    NSInteger month = [comps month]; 
    if (month == 12) { 
     [comps setYear:[comps year] + 1]; 
     [comps setMonth:1]; 
    } else { 
     [comps setMonth:month + 1]; 
    } 
} 

Пример вывода:

$ ./dateiter 19990112 19990212 12 
2014-01-16 13:06:53.189 dateiter[16740:707] start-date=1999-01-12 00:00:00 +0000, end-date=1999-02-12 00:00:00 +0000, want-day=12 
2014-01-16 13:06:53.189 dateiter[16740:707] Comparing 19990112 
2014-01-16 13:06:53.190 dateiter[16740:707] Comparing 19990212 
2014-01-16 13:06:53.190 dateiter[16740:707] Comparing 19990312 
2014-01-16 13:06:53.190 dateiter[16740:707] 2 months 

$ ./dateiter 20111121 20130515 16 
2014-01-16 13:10:53.318 dateiter[16810:707] start-date=2011-11-21 00:00:00 +0000, end-date=2013-05-15 00:00:00 +0000, want-day=16 
2014-01-16 13:10:53.319 dateiter[16810:707] Comparing 20111216 
2014-01-16 13:10:53.319 dateiter[16810:707] Comparing 20120116 
2014-01-16 13:10:53.319 dateiter[16810:707] Comparing 20120216 
2014-01-16 13:10:53.319 dateiter[16810:707] Comparing 20120316 
2014-01-16 13:10:53.320 dateiter[16810:707] Comparing 20120416 
2014-01-16 13:10:53.320 dateiter[16810:707] Comparing 20120516 
2014-01-16 13:10:53.320 dateiter[16810:707] Comparing 20120616 
2014-01-16 13:10:53.320 dateiter[16810:707] Comparing 20120716 
2014-01-16 13:10:53.321 dateiter[16810:707] Comparing 20120816 
2014-01-16 13:10:53.321 dateiter[16810:707] Comparing 20120916 
2014-01-16 13:10:53.321 dateiter[16810:707] Comparing 20121016 
2014-01-16 13:10:53.322 dateiter[16810:707] Comparing 20121116 
2014-01-16 13:10:53.322 dateiter[16810:707] Comparing 20121216 
2014-01-16 13:10:53.322 dateiter[16810:707] Comparing 20130116 
2014-01-16 13:10:53.322 dateiter[16810:707] Comparing 20130216 
2014-01-16 13:10:53.323 dateiter[16810:707] Comparing 20130316 
2014-01-16 13:10:53.323 dateiter[16810:707] Comparing 20130416 
2014-01-16 13:10:53.323 dateiter[16810:707] Comparing 20130516 
2014-01-16 13:10:53.323 dateiter[16810:707] 17 months 
+0

Это выглядит великолепно! На самом деле я еще не впился в способности NSDateComponents, так что это будет отличный опыт обучения. Я обязательно попробую в этот уик-энд, когда я получу шанс. Благодаря! –

4

Попробуйте это,

//your dates 
//NSDate *fromDateTime = dateFromString:@"11-21-2011"; 
//NSDate *toDateTime = dateFromString:@" 5-15-2013"; 

NSDate *fromDate; 
NSDate *toDate; 

NSCalendar *calendar = [NSCalendar currentCalendar]; 

[calendar rangeOfUnit:NSMonthCalendarUnit | NSDayCalendarUnit startDate:&fromDate 
      interval:NULL forDate:fromDateTime]; 
[calendar rangeOfUnit:NSMonthCalendarUnit | NSDayCalendarUnit startDate:&toDate 
      interval:NULL forDate:toDateTime]; 

NSDateComponents *difference = [calendar components:NSMonthCalendarUnit | NSDayCalendarUnit 
              fromDate:fromDate toDate:toDate options:0]; 

NSInteger occurance = [difference month]; 

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:fromDate]; 
NSInteger fromDay = [components day]; 

if (fromDay < 16) { 
    occurance = occurance + 1; 
} 

components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:toDate]; 
NSInteger toDay = [components day]; 
if (toDay > 16) { 
    occurance = occurance + 1; 
} 

//now occurance will be number of times the 16th of each month has passed between fromDate and toDate 
Смежные вопросы