2011-12-09 2 views
7

나는 날짜 선택 도구가 있습니다.미래의 NSD 배열을 배열하십시오

시간을 선택하면 다음 64 일간의 날짜를 얻고 싶습니다.

어떻게 날짜를 가지고 예에 해당 날짜

에서 다음 64 명 월요일에 대한 NSDates의있는 NSArray를 반환하는 방법을 쓰고 가겠어요 날짜 선택 도구에서 오후 6시 45 분에 시간을 집어 넣은 다음 그 시간으로 설정 한 다음 64 시간을 가져 오려고합니다.

+8

, 나는 가까운 투표에 동의하지 않는다. –

+0

옙 ... 이것은 상당히 도전적인 질문입니다. Ayaz, 다음 64 개의 월요일을 "가져오고 싶다"고 말할 때, 어떤 형태로 가져 오기를 원합니 까? NSDates 또는 EKEvents 또는? –

+0

NSDates가 필요합니다 ... –

답변

3

예 (ARC) :

NSDate *pickerDate = [NSDate date]; 
NSLog(@"pickerDate: %@", pickerDate); 

NSDateComponents *dateComponents; 
NSCalendar *calendar = [NSCalendar currentCalendar]; 

dateComponents = [calendar components:NSWeekdayCalendarUnit fromDate:pickerDate]; 
NSInteger firstMondayOrdinal = 9 - [dateComponents weekday]; 
dateComponents = [[NSDateComponents alloc] init]; 
[dateComponents setDay:firstMondayOrdinal]; 
NSDate *firstMondayDate = [calendar dateByAddingComponents:dateComponents toDate:pickerDate options:0]; 

dateComponents = [[NSDateComponents alloc] init]; 
[dateComponents setWeek:1]; 

for (int i=0; i<64; i++) { 
    [dateComponents setWeek:i]; 
    NSDate *mondayDate = [calendar dateByAddingComponents:dateComponents toDate:firstMondayDate options:0]; 
    NSLog(@"week#: %i, mondayDate: %@", i, mondayDate); 
} 

NSLog 출력 :
pickerDate를 : 2011-12-09 20시 38분 : 25 0000
주 번호 ​​: 0, mondayDate : 2011-12-12 20시 38분 25초 0000
주 번호 ​​: 1, mondayDate : 2011-12-19 20시 38분 25초 0000
주 번호 : 2, 월요일 날짜 : 2011-12-26 20:38:25 +0000
주 번호 ​​: 3, mondayDate : 기록을 위해 2012-01-02 20시 38분 25초 0000
년 - 나머지 60 여기 -

+0

답장을 보내 주셔서 감사합니다. 그 다음 4 월요일. 그냥 4 번 대신 63 번 반복해야하나요? –

+0

나는 처음 4 개를 보여 주었고, 나는 이것을 더 명확하게하기 위해 편집했다. – zaph

+1

궁금한 점은'firstMondayOrdinal' 계산을 위해 어디에서'9'를 얻었습니까? –

1

NSCalendar를 사용하여 오늘 (선택한 시간에) 요일을 결정할 수 있습니다. 그것을 다음 월요일에 도착하기 위해 튀기고, 그 다음 그것을 7 일까지 63 일까지 당신이 원하는 것처럼 보이는 월요일을 얻기 위해 부딪쳐 라.

2

피커에서 NSDate으로 시작하고 월요일이 될 때까지 24 * 60 * 60 초를 계속 추가하십시오. 결과에 결과 날짜를 추가하십시오. 마지막으로 추가 한 날짜까지 7 * 24 * 60 * 60 초를 더한 다음 64 개의 월요일을 모두 가질 때까지 결과를 반환 목록으로 밀어 넣으십시오. 여기 NSDate 월요일에 떨어지면 당신이 말할 방법은 다음과 같습니다

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *weekdayComponents =[gregorian components:NSWeekdayCalendarUnit fromDate:dateOfInterest]; 
NSInteger weekday = [weekdayComponents weekday]; 
if (weekday == 2) ... // 2 represents Monday 

편집 : DaveDeLong 위의 알고리즘의 부족을 지적했다 : 그것은 절약 시간을 일광 변경하는 일에 시간을 두 번 이동합니다. 대신 계산 (초)의 수동 NSDate에 하루를 추가하려면이 코드를 사용

NSDate *currentDate = [NSDate date]; 
NSDateComponents *comps = [[NSDateComponents alloc] init]; 
[comps setDay:1]; // Add 1 when searching for the next Monday; add 7 when iterating 63 times 
NSDate *date = [gregorian dateByAddingComponents:comps toDate:currentDate options:0]; 
[comps release]; 
+2

NO NO NO NO 이것은 일광 절약 시간을 고려하지 않습니다! 그리고 질문자는 그가 똑같은 시간을 지키길 바란다고 분명히 말했습니다. –

+0

@DaveDeLong 잘 잡으세요! 고정 ... – dasblinkenlight

+1

@DaveDeLong 애플이 과거 실적으로부터 판단한 일광 절약 시간을 안다면 다소 논의가있다. :-) – zaph

관련 문제