Reputation: 183
When my system-calendar is set on a sunday, the code below thinks it's a new week and display next weeks all days. for example This week is week 39. On sunday 28th of september my code thinks it's a new week and displays all the days for next week (week 40) instead of week 39 as i want it to be. (Where i live one week ranges from Monday to sunday NOT Sunday to Saturday)
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);
My log shows: 2014-09-21 22:40:36.040 NSCalendarProject[38667:90b] 2014-09-22 2014-09-23 2014-09-24 2014-09-25 2014-09-26 2014-09-27 2014-09-28
As you can see, the date when i ran this is on a sunday 21th of September and it display all the days of the next week (It's the same if i set the date on 28th of September)
Upvotes: 0
Views: 187
Reputation: 1200
Calling [myCalendar setFirstWeekday:2] only sets the first weekday on monday. However, sunday is still '1'. So, when currentDate is a sunday, '2' refers to the monday after that sunday and your code ends up with the dates of the next week.
What you really want is get the first day of the week of which 'currentDate' is part of. This code should work, but I don't know if it's the most elegant solution.
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);
Upvotes: 2