【问题标题】:How can I get a NSArray to contain each date of current week?如何让 NSArray 包含当前一周的每个日期?
【发布时间】:2013-12-16 07:47:50
【问题描述】:

目前我可以获得一周的开始日期和结束日期,但我想获取整周的日期并将其放入数组中。我使用 + 1 来计算日期,但如果有跨月,它会返回错误的结果。

这是我的代码:

-(NSArray *) getWorkWeekDays:(NSDate *)date {
    NSCalendar *gregorian = [[NSCalendar alloc]        
    initWithCalendarIdentifier:NSGregorianCalendar];
    NSArray *period = [self getWorkWeekPeriod:date];//This function will return the begin and  end date of week based on the "date" parameter. return 2 Object

    NSMutableArray *weekDays = [[NSMutableArray alloc] init];
    NSInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit |    
    NSWeekdayCalendarUnit |
    NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
    NSDateComponents *bgnComps = [gregorian components:unitFlags fromDate:period[0]]
    int bgnDay = [bgnComps day];
    NSString *firstDay = [NSString stringWithFormat:@"%d",bgnDay];

    [weekDays addObject:firstDay];
    for (int i = 1; i <= 6 ;i++) {
        [ bgnComps setDay :([ bgnComps day ]  +  1 )];
        int nextDay = [bgnComps day];
        NSString *day = [NSString stringWithFormat:@"%d",nextDay];
        [weekDays addObject:day];
    }
    return weekDays;} 

//在这种情况下,当我将 2013/11/25 作为开始日期时,我会得到 2013/11/25 2013/11/26 2013/11/27 2013/11/28 2013/11/29 2013/11/30 2013/11/31

【问题讨论】:

    标签: ios objective-c cocoa-touch nsdate


    【解决方案1】:

    此代码用NSDate 对象填充一个数组,其中包含当前一周中每一天的开始时间

    NSDate *now = [NSDate date];
    
    NSCalendar *calendar = [NSCalendar currentCalendar];
    
    NSDate *beginningOfThisWeek;
    NSDate *beginningOfNextWeek;
    
    NSTimeInterval durationOfWeek;
    
    [calendar rangeOfUnit:NSWeekCalendarUnit
                startDate:&beginningOfThisWeek
                 interval:&durationOfWeek
                  forDate:now];
    
    beginningOfNextWeek = [beginningOfThisWeek dateByAddingTimeInterval:durationOfWeek];
    
    
    NSDate *date = beginningOfThisWeek;
    NSMutableArray *dateArray = [@[] mutableCopy];
    
    while (![beginningOfNextWeek compare:date]  == NSOrderedSame) {
        [dateArray addObject:date];
        NSDateComponents *comps = [calendar components:NSUIntegerMax fromDate:date];
        comps.day +=1;
        date = [calendar dateFromComponents:comps];
    
    }
    

    代码中的问题源于您使用NSStrings 表示日期,尽管您使用NSDateComponents,但您并没有将它们转换为日期对象,而是直接转换为字符串。

    如果你想用字符串表示日期,你应该使用NSDateFormatter


    或者,如果您对 for 循环感觉更舒服:

    NSDate *now = [NSDate date];
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDate *beginningOfThisWeek;
    NSTimeInterval durationOfWeek;
    
    [calendar rangeOfUnit:NSWeekCalendarUnit
                startDate:&beginningOfThisWeek
                 interval:&durationOfWeek
                  forDate:now];
    
    
    NSMutableArray *dateArray = [@[] mutableCopy];
    NSDateComponents *comps = [calendar components:NSUIntegerMax fromDate:beginningOfThisWeek];
    
    for (NSUInteger i = 0; i < 7; ++i) {
        [dateArray addObject:[calendar dateFromComponents:comps]];
        ++comps.day;
    }
    

    【讨论】:

    • 虽然最初看起来很容易,但正确地进行日历计算却很难。您应该观看 WWDC 2011 视频«Performing Calendar Calculations»。并且永远不要使用60*60*24 (86400),总有一天你的代码会坏掉。
    • 明白了!!感谢提醒正确的做日历的方法,否则60*60*24(86400)一定会用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 2021-10-25
    相关资源
    最近更新 更多