0

NextDateMatchingDay Objective-C メソッド - このコードよりも良い方法はありますか?

- (NSDate*)NextDateMatchingDay:(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
}
4

1 に答える 1

0

これは改善されたようです - さらに凝縮する方法がまだあるかどうかはわかりませんか?

+ (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;
}
于 2011-04-30T23:26:01.197 に答える