如果今天是星期天,请在下周工作日获取周开始日期

时间:2014-04-18 10:08:49

标签: ios nsdate nscalendar

我有一个功能,通过在我的应用程序中传递任何特定日期返回工作日,星期一将是星期开始日,它工作正常,除非设置当天到星期日,在这种情况下函数在下个工作日返回,

+(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日

即使当天设定为星期日,我怎样才能使其正常工作?

由于

1 个答案:

答案 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。 如果您没有设置时区,那么您将获得本周的开始 根据您当地的时区。