Mik*_*e T 1 cocoa nsdate nscalendar nsdatecomponents
给定一个任意日期,我需要找到该月下一周第一天的日期.请注意,它并不像在当前日期添加7天那么简单,因为该月的最后一周可能少于7天.这是我现在使用的代码:
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [calendar components:NSWeekOfMonthCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSDayCalendarUnit fromDate:currentDate];
NSLog(@"week of month: %ld", [components weekOfMonth]);
[components setWeekOfMonth:[components weekOfMonth] + 1];
NSLog(@"new week of month: %ld", [components weekOfMonth]); //week of month is now 2
[components setWeekday:1];
NSDate *nextWeek = [calendar dateFromComponents:components];
Run Code Online (Sandbox Code Playgroud)
例如,currentDate设置为2012-10-01.在这个例子中,nextWeek始终是2012-10-01.似乎发送setWeekOfMonth:不会增加NSDateComponents对象中的其他日期组件.我是否配置了错误的日期组件,或者setWeekOfMonth:不应该这样工作?
所以....让我们从一个NSDate和一个开始NSCalendar:
NSDate *date = ...;
NSCalendar *cal = [NSCalendar currentCalendar];
Run Code Online (Sandbox Code Playgroud)
弄清楚该日期的哪一天是:
NSInteger weekdayOfDate = [cal ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:date];
NSInteger numberOfDaysToStartOfCurrentWeek = weekdayOfDate - 1;
Run Code Online (Sandbox Code Playgroud)
让我们将该日期移至下周:
NSDateComponents *oneWeek = [[NSDateComponents alloc] init];
[oneWeek setWeek:1]; // add one week
[oneWeek setDay:-numberOfDaysToStartOfCurrentWeek]; // ... and subtract a couple of days to get the first day of the week
NSDate *startOfNextWeek = [cal dateByAddingComponents:oneWeek toDate:date options:0];
Run Code Online (Sandbox Code Playgroud)
此时,您的日期指向下周的第一天.现在我们应该验证它仍然在同一个月:
NSDateComponents *monthOfNextWeek = [cal components:NSMonthCalendarUnit fromDate:startOfNextWeek];
NSDateComponents *monthOfThisWeek = [cal components:NSMonthCalendarUnit fromDate:date];
if ([monthOfNextWeek month] != [monthOfThisWeek month]) {
// the first day of the next week is not in the same month as the start date
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我知道下周的开始时间是2012年12月30日(星期日,因为我的日历星期日开始于星期日).
但是,如果我希望星期一的第一天开始,我可以在这个代码前面加上:
[cal setFirstWeekday:2]; // the first day of the week is the second day (ie, Monday, because Sunday = 1)
Run Code Online (Sandbox Code Playgroud)
如果我这样做,那么startOfNextWeek结果将在2012年12月31日.
| 归档时间: |
|
| 查看次数: |
2274 次 |
| 最近记录: |