2014-09-22 88 views
0

當我的系統日曆設置在星期日時,下面的代碼認爲這是一個新的一週,並在接下來的幾周顯示所有日子。 例如 本週是39周。 9月28日我的代碼認爲這是一個新的一週,並顯示下週(第40周)的所有日子,而不是第39周,因爲我希望它是。 (我住的地方1周範圍從週一到週日不星期日至星期六)當系統日曆在星期日時,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-09-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 2014-10-02 21:23:52

+0

不客氣,很高興有所幫助。從什麼意義上說它只能在2014年發揮作用?例如,當我(例如)2015年1月4日星期日,我將於2014年12月22日星期一到2015年1月4日星期日。是不是正確的行爲? – Tuslareb 2014-10-03 19:16:00

相關問題