2014-09-22 3 views
0

일요일에 시스템 캘린더를 설정하면 아래 코드는 그것이 새로운 주라고 판단하고 다음 주를 종일 표시합니다. 예 : 이번 주는 39 주입니다. 일요일 10 월 28 일에 내 코드는 새로운 주라고 생각하고 다음 주 (40 주)의 모든 요일을 39 ​​일 대신 39 일로 표시합니다. (난 토요일 NOT 일요일 월요일부터 일요일까지 일주일 범위를 살) 는시스템 캘린더가 일요일에있을 때 NSCalendar는 새 주라고 생각합니다.

NSDate *currentDate = [NSDate date]; 
NSCalendar *myCalendar = [NSCalendar currentCalendar]; 

[myCalendar setLocale:[NSLocale systemLocale]]; 

    NSDateComponents *currentComps = [myCalendar components:NSYearForWeekOfYearCalendarUnit |NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:currentDate]; 
int thisWeeksNumber = currentComps.weekOfYear; 
NSLog(@"1 %d", thisWeeksNumber); 

[myCalendar setFirstWeekday:2]; 


[currentComps setWeekday:2]; 
NSDate *firstDayOfTheWeek = [myCalendar dateFromComponents:currentComps]; 
[currentComps setWeekday:3]; 
NSDate *secondDayOfTheWeek = [myCalendar dateFromComponents:currentComps]; 
[currentComps setWeekday:4]; 
NSDate *thirdDayOfTheWeek = [myCalendar dateFromComponents:currentComps]; 
[currentComps setWeekday:5]; 
NSDate *fourthDayOfTheWeek = [myCalendar dateFromComponents:currentComps]; 
[currentComps setWeekday:6]; 
NSDate *fifthDayOfTheWeek = [myCalendar dateFromComponents:currentComps]; 
[currentComps setWeekday:7]; 
NSDate *sixthDayOfTheWeek = [myCalendar dateFromComponents:currentComps]; 
[currentComps setWeekday:1]; 
NSDate *seventhDayOfTheWeek = [myCalendar dateFromComponents:currentComps]; 


NSDateFormatter *myDateFormatter = [[NSDateFormatter alloc] init]; 
myDateFormatter.dateFormat = @"yyyy-MM-dd"; 
NSString *firstStr = [myDateFormatter stringFromDate:firstDayOfTheWeek]; 
NSString *secondStr = [myDateFormatter stringFromDate:secondDayOfTheWeek]; 
NSString *thirdStr = [myDateFormatter stringFromDate:thirdDayOfTheWeek]; 
NSString *fourthStr = [myDateFormatter stringFromDate:fourthDayOfTheWeek]; 
NSString *fifthStr = [myDateFormatter stringFromDate:fifthDayOfTheWeek]; 
NSString *sixthStr = [myDateFormatter stringFromDate:sixthDayOfTheWeek]; 
NSString *seventhStr = [myDateFormatter stringFromDate:seventhDayOfTheWeek]; 

NSLog(@"\n %@ \n %@ \n %@ \n %@ \n %@ \n %@ \n %@", firstStr, secondStr, thirdStr, fourthStr, fifthStr, sixthStr, seventhStr); 

내 로그 보여줍니다 2014년 9월 21일 22 : 40 : 36.040 NSCalendarProject [38667을 : 90B] 2014-09- 22 2014년 9월 23일 2014년 9월 24일 2014년 9월 25일 2014년 9월 26일 2014년 9월 27일 2014년 9월 28일

당신이 볼 수 있듯이, 날짜 내가 이 일은 9 월 21 일 일요일에 있었고 다음 주 모든 요일을 표시합니다 (날짜를 설정하면 똑같습니다). 9 월 28 일)

답변

2

[myCalendar setFirstWeekday : 2]를 호출하면 월요일의 첫 번째 요일 만 설정됩니다. 그러나 일요일은 여전히 ​​'1'입니다. 따라서 currentDate가 일요일 인 경우 '2'는 일요일이 끝난 다음 월요일을 가리키고 코드는 다음 주 날짜로 끝납니다.

정말로 원하는 것은 'currentDate'가 속한 첫 번째 요일을 얻는 것입니다. 이 코드는 작동하지만 가장 세련된 솔루션인지는 알 수 없습니다.

NSCalendar *myCalendar = [NSCalendar currentCalendar]; 

    //create a 'sunday' date object for demonstration purposes 
    NSDateComponents *sundayComponents = [[NSDateComponents alloc]init]; 
    sundayComponents.day = 28; 
    sundayComponents.month = 9; 
    sundayComponents.year = 2014; 
    NSDate *sunday = [myCalendar dateFromComponents:sundayComponents]; 

    [myCalendar setLocale:[NSLocale systemLocale]]; 

    NSDateComponents *currentComps = [myCalendar components:NSYearForWeekOfYearCalendarUnit |NSYearCalendarUnit|NSMonthCalendarUnit|NSCalendarUnitWeekOfYear|NSWeekdayCalendarUnit fromDate:sunday]; 
    int thisWeeksNumber = currentComps.weekOfYear; 
    NSLog(@"1 %d", thisWeeksNumber); 

    [myCalendar setFirstWeekday:2]; 
    NSDate *beginningOfWeek = nil; 
    [myCalendar rangeOfUnit:NSCalendarUnitWeekOfYear startDate:&beginningOfWeek 
        interval:NULL forDate: sunday]; 


    NSDateComponents *components = [[NSDateComponents alloc] init]; 

    NSDate *firstDayOfTheWeek = beginningOfWeek; 
    components.day = 1; 
    NSDate *secondDayOfTheWeek = [myCalendar dateByAddingComponents:components toDate:beginningOfWeek options:0]; 
    components.day = 2; 
    NSDate *thirdDayOfTheWeek = [myCalendar dateByAddingComponents:components toDate:beginningOfWeek options:0]; 
    components.day = 3; 
    NSDate *fourthDayOfTheWeek = [myCalendar dateByAddingComponents:components toDate:beginningOfWeek options:0]; 
    components.day = 4; 
    NSDate *fifthDayOfTheWeek = [myCalendar dateByAddingComponents:components toDate:beginningOfWeek options:0]; 
    components.day = 5; 
    NSDate *sixthDayOfTheWeek = [myCalendar dateByAddingComponents:components toDate:beginningOfWeek options:0]; 
    components.day = 6; 
    NSDate *seventhDayOfTheWeek = [myCalendar dateByAddingComponents:components toDate:beginningOfWeek options:0]; 


    NSDateFormatter *myDateFormatter = [[NSDateFormatter alloc] init]; 
    myDateFormatter.dateFormat = @"yyyy-MM-dd"; 
    NSString *firstStr = [myDateFormatter stringFromDate:firstDayOfTheWeek]; 
    NSString *secondStr = [myDateFormatter stringFromDate:secondDayOfTheWeek]; 
    NSString *thirdStr = [myDateFormatter stringFromDate:thirdDayOfTheWeek]; 
    NSString *fourthStr = [myDateFormatter stringFromDate:fourthDayOfTheWeek]; 
    NSString *fifthStr = [myDateFormatter stringFromDate:fifthDayOfTheWeek]; 
    NSString *sixthStr = [myDateFormatter stringFromDate:sixthDayOfTheWeek]; 
    NSString *seventhStr = [myDateFormatter stringFromDate:seventhDayOfTheWeek]; 

    NSLog(@"\n %@ \n %@ \n %@ \n %@ \n %@ \n %@ \n %@", firstStr, secondStr, thirdStr, fourthStr, fifthStr, sixthStr, seventhStr); 

    //log first day of week 
    NSString *beginningWeek = [myDateFormatter stringFromDate:beginningOfWeek]; 
    NSLog(@"beginning of week is %@", beginningWeek); 
+0

답변 해 주셔서 감사합니다. 나는 지금 문제를 해결했다! 그리고 이것은 2014 년 동안 만 작동합니다. – Dridia

+0

도움이되기를 기쁘게 생각합니다. 어떤 의미에서 2014 년으로 만 작동합니까? 2015 년 1 월 일요일 (예 : 일요일)에 넣으면 2014 년 12 월 22 일 월요일에 2015 년 1 월 4 일에 일요일에 나옵니다. 올바른 행동이 아닌가요? – Tuslareb