How would I add only business days to an NSDate?

前端 未结 4 1382
难免孤独
难免孤独 2021-02-04 18:55

I have an issue related to calculating business days in Objective-C.

I need to add X business days to a given NSDate.

For example, if

4条回答
  •  清歌不尽
    2021-02-04 19:47

    this answer is late to the party but…. I thought i might improve on above answers to determine business days by working with NSDateComponents directly of your date in a nice loop.

    #define CURRENTC [NSCalendar currentCalendar]
    #define CURRENTD [NSDate date]
    
    NSInteger theWeekday;
    
        NSDateComponents* temporalComponents = [[NSDateComponents alloc] init];
    
    [temporalComponents setCalendar:CURRENTC];
    [temporalComponents setDay:   13];
    [temporalComponents setMonth: 2];
    [temporalComponents setYear: theYear];
    
    // CURRENTC =the current calendar which determines things like how 
    // many days in week for local,  also the critical “what is a weekend”
    // you can also convert a date directly to components.  but the critical thing is
    // to get the CURRENTC in, either way.
    
       case 3:{    // the case of finding business days
            NSDateComponents* startComp = [temporalComponents copy];  // start date components
    
            for (int i = 1; i <= offset; i++)  //offset is the number of busi days you want.
            {
                do {
                    [temporalComponents setDay:   [temporalComponents day] + 1];
                    NSDate* tempDate = [CURRENTC dateFromComponents:temporalComponents];
                    theWeekday = [[CURRENTC components:NSWeekdayCalendarUnit fromDate:tempDate] weekday];
                } while ((theWeekday == 1) || (theWeekday == 7));
            }
            [self findHolidaysStart:startComp end:temporalComponents];  // much more involved routine.
    
            [startComp release];
            break;
         }
    
    // use startComp and temporalcomponents before releasing
    
    // temporalComponents now contain an offset of the real number of days 
    // needed to offset for busi days.  startComp is just your starting date….(in components)
    // theWeekday is an integer between 1 for sunday, and 7 for saturday,  (also determined
    // by CURRENTC
    

    turning this back into NSDate, and you are done. Holidays are much more involved.. but can actually be calculated if just using federal holidays and a few others. because they are always something like “3rd monday of January”

    here is what the findHolidaysStart:startComp end: starts out like, you can imagine the rest.

    // imported
    
        [holidayArray addObject:[CURRENTC dateFromComponents:startComp]];
        [holidayArray addObject:[CURRENTC dateFromComponents:endComp]];
    
    
    // hardcoded
    
       dateComponents = [[NSDateComponents alloc] init];
        [dateComponents setCalendar:CURRENTC];
        [dateComponents setDay:   1];
        [dateComponents setMonth: 1];
        [dateComponents setYear: theYear];
    
        theWeekday = [[CURRENTC components:NSWeekdayCalendarUnit fromDate:[CURRENTC dateFromComponents:dateComponents]] weekday];
    
        if (theWeekday == 1) [dateComponents setDay:2];
        if (theWeekday == 7) {[dateComponents setDay:31]; [dateComponents setYear: theYear-1];}
    
        [holidayArray addObject:[CURRENTC dateFromComponents:dateComponents]];
        [dateComponents release];
    

提交回复
热议问题