我有一个功能,通过在我的应用程序中传递任何特定日期返回工作日,星期一将是星期开始日,它工作正常,除非设置当天到星期日,在这种情况下函数在下个工作日返回,
+(NSMutableArray*) getWeekDatesList :(NSDate*) date {
@autoreleasepool {
NSDate *startingDateOfWeek = [self getWeekStartDateWithDate:date];
return [self getWeekDatesListWithStartDate:startingDateOfWeek];
}
},
和获取周开始日期的功能是,
+(NSDate*) getWeekStartDateWithDate:(NSDate*) date{
@autoreleasepool {
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setLocale:[NSLocale currentLocale]];
[gregorian setFirstWeekday:2]; // 2 monday
[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
NSDateComponents *components = [gregorian components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekOfYearCalendarUnit |NSWeekCalendarUnit fromDate:date];
int value =([components day]-([components weekday]-2));
[components setDay:value];
[components setHour:0];
[components setMinute:0];
[components setSecond:0];
NSDate *beginningOfWeek = [gregorian dateFromComponents:components];
return beginningOfWeek;
}
}
示例:
今天设置 2014年4月20日星期日,我们将周开始日期定为 2014年4月21日,但预计周开始日期 2014年4月13日
即使当天设定为星期日,我怎样才能使其正常工作?
由于
答案 0 :(得分:3)
在您的计算中,您必须检查[components weekday]
是否更小或更大
超过2(星期一)并相应地修改组件以获得上一个星期一。
但您可以将计算简化为:
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
// [gregorian setLocale:[NSLocale currentLocale]]; (This is the default.)
[gregorian setFirstWeekday:2]; // 2 = Monday
[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
NSDate *beginningOfWeek;
[gregorian rangeOfUnit:NSWeekCalendarUnit startDate:&beginningOfWeek interval:NULL forDate:date];
按预期给出 2014-04-14 00:00:00 +0000 (星期一)。
备注:您应该检查是否确实要将时区设置为GMT。 如果您没有设置时区,那么您将获得本周的开始 根据您当地的时区。