【问题标题】:Get Week Start date returning next week day if today is sunday如果今天是星期天,则获取下一周返回的周开始日期
【发布时间】:2014-04-18 10:08:49
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: ios nsdate nscalendar


    【解决方案1】:

    在您的计算中,您必须检查 [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。 如果您不设置时区,那么您将获得一周的开始 根据您当地的时区。

    【讨论】:

    • 嗨马丁,谢谢这个例外!这个解决方案也更简单。是的,我需要在 GMT 进行我们的流程
    猜你喜欢
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多