NextDateMatchingDay objective-c method - is there a better way than this code I've got?
- (NSDate*)NextDa开发者_开发技巧teMatchingDay:(NSDateComponents*)dayTime {
    // Find next date (including date & time) from current date, for which:
    // (a) the DayOfWeek(no time) matches that dayOfWeek from the input "dateTime" NSDateComponents
    // (b) the date is > currentDateTime
    // (c) the final date time will be based on the time passed in by "dateTime" NSDateComponents
    // e.g. dayTime=Sun10am's, currentDate=Sun1st2pm => result=Sun8th10am
    // e.g. dayTime=Sun10am's, currentDate=Sun1st9am => result=Sun1st10am
    // e.g. dayTime=Sun10am's, currentDate=Fri1st1pm => result=Sun8th10am
    // Prepare
    NSDate *currDate = [NSDate date];
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *addComps = [[[NSDateComponents alloc] init] autorelease];
    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
    NSDateComponents* currComps =  [gregorian components:unitFlags fromDate:currDate];
    NSInteger daysCounter = 0;
    do {
        [addComps setDay:daysCounter];
        NSDate *futureDate = [gregorian dateByAddingComponents:addComps toDate:currDate options:0];
        NSDateComponents* futureComps = [gregorian components:unitFlags fromDate:futureDate];
        if ( [futureComps day] == [currComps day] && [futureComps month] == [currComps month] && [futureComps year]  == [currComps year] )
            return futureDate;
        daysCounter++;                        
    } while (daysCounter < 10);     // just a double check 
    return nil;                     // double check - should not get to this
}
this seems to be an improvement - not sure if there's still a way to condense down further though?
+ (NSDate*)NextDateMatchingDay:(NSDateComponents*)dayTime sourceDate:(NSDate*)sourceDate {
    // Find next date (including date & time) from current date, for which:
    // (a) the DayOfWeek(no time) matches that dayOfWeek from the input "dateTime" NSDateComponents
    // (b) the date is > currentDateTime
    // (c) the final date time will be based on the time passed in by "dateTime" NSDateComponents
    // e.g. dayTime=Sun10am's, currentDate=Sun1st2pm => result=Sun8th10am
    // e.g. dayTime=Sun10am's, currentDate=Sun1st9am => result=Sun1st10am
    // e.g. dayTime=Sun10am's, currentDate=Fri1st1pm => result=Sun8th10am
    NSDate *returnDate = [sourceDate dateWithHoursMinsSecsComps:dayTime];
    // Check if is same day
    NSInteger configDOW = [dayTime weekday];
    NSInteger sourceDOW = [sourceDate dayOfWeek];
    if ( configDOW == sourceDOW ) {
        // source date is already the correct day - but is it before or after
        if ( [returnDate isBeforeThisDate:sourceDate] ) {
            // can't be source Date - so move forward 7 days
            returnDate = [returnDate dateByAddingDays:7];
            return returnDate;
        } else {
            // can be source Date (with new time)
            return returnDate;
        }
    }
    // source day is on another day-of-week other than the dayTime provided value
    NSInteger dayOfWeekDiff = (7 + (configDOW - sourceDOW)) % 7;
    returnDate = [returnDate dateByAddingDays:dayOfWeekDiff];
    return returnDate;
}
 
         
                                         
                                         
                                         
                                        ![Interactive visualization of a graph in python [closed]](https://www.devze.com/res/2023/04-10/09/92d32fe8c0d22fb96bd6f6e8b7d1f457.gif) 
                                         
                                         
                                         
                                         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论