2013-07-30 3 views

답변

5

다음 코드의 아이디어는 시작 날짜 이후 주어진 평일의 첫 번째 발생을 계산 한 다음 종료 날짜에 나머지 주의 수를 계산하는 것이다.

NSDate *fromDate = ...; 
NSDate *toDate = ...; 
NSUInteger weekDay = ...; // The given weekday, 1 = Sunday, 2 = Monday, ... 
NSUInteger result; 

// Compute weekday of "fromDate": 
NSCalendar *cal = [NSCalendar currentCalendar]; 
NSDateComponents *c1 = [cal components:NSWeekdayCalendarUnit fromDate:fromDate]; 

// Compute next occurrence of the given weekday after "fromDate": 
NSDateComponents *c2 = [[NSDateComponents alloc] init]; 
c2.day = (weekDay + 7 - c1.weekday) % 7; // # of days to add 
NSDate *nextDate = [cal dateByAddingComponents:c2 toDate:fromDate options:0]; 

// Compare "nextDate" and "toDate": 
if ([nextDate compare:toDate] == NSOrderedDescending) { 
    // The given weekday does not occur between "fromDate" and "toDate". 
    result = 0; 
} else { 
    // The answer is 1 plus the number of complete weeks between "nextDate" and "toDate": 
    NSDateComponents *c3 = [cal components:NSWeekCalendarUnit fromDate:nextDate toDate:toDate options:0]; 
    result = 1 + c3.week; 
} 

(코드는 일주일에 그레고리오 력의 사실 인 7 일이 있다고 가정합니다. 필요한 경우 코드는 아마도 임의의 달력 작업을 일반화 할 수있다.)

+2

언급 한 일반화는 하드 7을'[cal rangeOfUnit : NSWeekdayCalendarUnit inUnit : NSWeekCalendarUnit forDate : fromDate]'로 대체하는 것처럼 간단해야합니다. –

0
NSDateComponents *components = [gregorianCalendar components:NSDayCalendarUnit fromDate:[NSDate date] toDate:[NSDate date]]; 
//pass different date in fromDate and toDate column. 
+2

질문은 (있는 경우 나는 그것을 정확하게 이해한다) 얼마나 많은 것인가? 일요일은 두 주어진 날짜 사이에 있습니다. –

+0

어디서 요일을 지정해야합니까 (예 : 월요일 또는 화요일 또는 금요일 등) ?? 특정 평일의 출현 만 계산하기 때문에. – DemonicPossessions1991

+0

@MartinR : 당연히 일요일뿐만 아니라. 일주일 중 언제라도 가능합니다. 예 : 월요일 또는 화요일 또는 다른 날, 그래, 맞아, 너는 나를 정확하게 잡았다 .. – DemonicPossessions1991