我的問題的邏輯是一口,我已經想出了一個解決方案。我的解決方案發布如下。我期待看看是否有人能夠提出更高效/更簡單的解決方案。NSDate得到下一個發生在未來的工作日
該方法應該返回從現在開始的下一個未來,在給定日期發生的工作日。時間應該保留在輸入日期和輸出日期之間。
對於所有的例子,今天是星期五2015年5月8日,4:00 PM: 所有輸入和輸出都在2015:
+---------------------------+---------------------------+
| Input | Output |
+---------------------------+---------------------------+
| Tuesday April 7, 3:00 PM | Monday May 11, 3:00 PM |
| Thursday May 7, 3:00 PM | Monday May 11, 3:00 PM |
| Thursday May 7, 5:00 PM | Friday May 8, 5:00 PM |
| Tuesday May 12, 3:00 PM | Wednesday May 13, 3:00 PM |
| Saturday June 20, 3:00 PM | Monday June 22, 3:00 PM |
+---------------------------+---------------------------+
下面是一些邏輯僞代碼:
do {
date += 1 day;
} while(date.isWeekend || date.isInThePast)
這裏是我想出瞭解決方案,避免了使用循環保持效率記住:
- (NSDate *)nextWeekDayInFuture {
NSDate *now = [NSDate date];
NSDate *nextWeekDaydate;
NSCalendar *calendar = [NSCalendar currentCalendar];
nextWeekDaydate = [self dateByAddingDays:1]; // custom method, adds 1 day
if ([nextWeekDaydate isLessThan:now]) {
NSDateComponents *nowComponents = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:now];
NSDateComponents *dateComponents = [calendar components:(NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond) fromDate:nextWeekDaydate];
[nowComponents setHour:dateComponents.hour];
[nowComponents setMinute:dateComponents.minute];
[nowComponents setSecond:dateComponents.second];
nextWeekDaydate = [calendar dateFromComponents:nowComponents];
if ([nextWeekDaydate isLessThan:now]) {
nextWeekDaydate = [nextWeekDaydate dateByAddingDays:1];
}
}
NSDateComponents *components = [calendar components:NSCalendarUnitWeekday fromDate:nextWeekDaydate];
if (components.weekday == Saturday) {
nextWeekDaydate = [nextWeekDaydate dateByAddingDays:2];
} else if (components.weekday == Sunday) {
nextWeekDaydate = [nextWeekDaydate dateByAddingDays:1];
}
return nextWeekDaydate;
}
在發佈解決方案之前,使用上面的輸入/輸出表來測試您的邏輯。
4月7日星期二的輸入如何給出5月份的星期一輸出?爲何不在4月8日星期三?第二行相同 - 爲什麼不是5月8日星期五 – Paulw11
請注意以下幾點:「對於所有示例,今天是2015年5月8日星期五下午4:00:所有投入和產出都在2015年:」。其中一個要求是,它必須在今後從今天起,返回的日期不能在過去。 –
我投票結束這個問題,因爲它屬於codereview.stackexchange.com。 – rmaddy