0

例えば:

元の日付:2012年3月23日間隔:2週間ごと

出力:最新の発生->2012年6月4日

Objective-C(iOS)でこれを最善の方法で実現するにはどうすればよいですか?

補足:私の現在はそれほど機能しておらず、本当に悪い解決策です:

+ (NSDate *) getRelativeStartDateForIntervalType:(NSInteger)intervalType andStartDateTime:(NSDate *)startDateTime {
    NSDateComponents *components = [[NSDateComponents alloc] init];
    BOOL found = false;
    NSDate *relativeStartDate;
    NSDate *previousDate;
    for (int i = 0; !found ; i++) {
        previousDate = relativeStartDate;

        switch (intervalType) {
            case 0:
                [components setDay:i];   // add i days
                break;
            case 1:
                [components setWeek:i];  // add i weeks
                break;
            case 2:
                [components setMonth:i]; // add i months
                break;
            case 3:
                [components setDay:i]; // add i weeks
                break;
            default:
                NSLog(@"you shouldn't be here");
                break;
        }
        relativeStartDate = [[NSCalendar currentCalendar] dateByAddingComponents:components toDate:startDateTime options:0];
        if ([relativeStartDate compare:[NSDate date]] == NSOrderedDescending) {
            found = true;
            if (i > 0 && [previousDate compare:[NSDate date]] == NSOrderedDescending) {
                relativeStartDate = previousDate;                
            }
        }
    }
    return  relativeStartDate;
}
4

1 に答える 1

0

「N 週間ごと」または「N 日ごと」の場合は、開始日と目標日の差を日数で取り、間隔の日数で割り、残りを目標日からさかのぼります。

つまり、擬似コードでは、relativeStartDate = targetDate - ((targetDate - startDate) % intervalSize)

「N か月ごと」の場合は、その月の同じ日の最新の発生に戻るだけです。条件付き以外にこれを行うクリーンな方法はありません。目標の mday が開始の mday よりも大きい場合は、月の日付が startdate の月の日付に置き換えられた目標日になります。それ以外の場合は、同じ置換で目標日の 1 か月前になります。

また、特定の月に存在しない日を処理する方法も決定する必要があります。5 月 31 日から 1 か月で 6 月 30 日または 7 月 1 日になりますか?

于 2012-04-15T20:00:04.657 に答える