使用NSDateComponents获得一周的第一天:改变一年

Rom*_*man 13 cocoa objective-c nsdatecomponents

您好我设置firstWeekDay有问题,这是我做的:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit) fromDate:targetDate];
[comp setWeekday:2];

NSDate *firstWeekDay = [gregorian dateFromComponents:comp];
Run Code Online (Sandbox Code Playgroud)

如果2011-01-01周六是targetDate,我日历中的第一周周日似乎是2011-12-26周一,但实际上应该是2010-12-26周一.我怎么能做对的?

Yve*_*sot 35

要解决此问题,在NSDateComponents中添加NSYearForWeekOfYearCalendarUnit.

例如:

NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* comps = [calendar components:NSYearForWeekOfYearCalendarUnit |NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:curDate];

[comps setWeekday:2]; // 2: monday
firstDayOfTheWeek = [calendar dateFromComponents:comps];
[comps setWeekday:7]; // 7: saturday
lastDayOfTheWeek = [calendar dateFromComponents:comps];
Run Code Online (Sandbox Code Playgroud)

  • 我的一天,这应该是接受的答案. (3认同)
  • 这是解决方案.如果您仍然遇到问题并使用了NSDayCalendarUnit,请尝试将其删除. (3认同)

Han*_*man 1

尝试这个

// adjust them for first day of previous week (Monday)
[comp setWeekday:2];
[comp setWeek:([comp week] - 1)];
Run Code Online (Sandbox Code Playgroud)

请注意,此解决方案假设一周的第一天是星期一。