0

例如:

原始日期:23/03/2012 间隔:每 2 周

输出:最近发生 -> 06/04/2012

如何在 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 的月份中的日期。否则,在目标日期前一个月使用相同的替换。

您还必须决定如何处理给定月份中不存在的日子;从 5 月 31 日到 6 月 30 日或 7 月 1 日有一个月吗?

于 2012-04-15T20:00:04.657 回答