2015-05-08 51 views
0

我的問題的邏輯是一口,我已經想出了一個解決方案。我的解決方案發布如下。我期待看看是否有人能夠提出更高效/更簡單的解決方案。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; 
} 

在發佈解決方案之前,使用上面的輸入/輸出表來測試您的邏輯。

+0

4月7日星期二的輸入如何給出5月份的星期一輸出?爲何不在4月8日星期三?第二行相同 - 爲什麼不是5月8日星期五 – Paulw11

+0

請注意以下幾點:「對於所有示例,今天是2015年5月8日星期五下午4:00:所有投入和產出都在2015年:」。其中一個要求是,它必須在今後從今天起,返回的日期不能在過去。 –

+1

我投票結束這個問題,因爲它屬於codereview.stackexchange.com。 – rmaddy

回答

0

沒有理由不把邏輯放在循環中,因爲最多它會循環兩次(如果當前日期是星期六)。

這裏是爲制定一個解決方案,如果當天是週末:How to find weekday from today's date using NSDate?

- (NSInteger)isWeekend:(NSDate*)inDate 
{ 
    NSCalendar* cal = [NSCalendar currentCalendar]; 
    NSDateComponents* comp = [cal components:kCFCalendarUnitWeekday fromDate:inDate]; 
    return [comp weekday]; 
} 

然後,我們可以調用這個方法,檢查返回NSInteger的,看它是否是坐着或太陽再次運行:

NSDate *now = [NSDate date]; 
now = [now dateByAddingTimeInterval:60*60*24]; // Add 1 day's worth. 

NSInteger curDay = [self isWeekend:now]; 

while ((curDay == 6) || (curDay == 1)) // Sat or Sund. 
{ 
    now = [now dateByAddingTimeInterval:60*60*24]; // Add 1 day's worth. 
    curDay = [self isWeekend:now]; 
} 

如果你真的要刪除的循環,你可以檢查它是否是星期六和加2天的,或者如果它的陽光加1天的。

NSDate *now = [NSDate date]; 
now = [now dateByAddingTimeInterval:60*60*24]; // Add 1 day's worth. 
NSInteger curDay = [self isWeekend:now]; 

if (curDay == 6) // Sat 
{ 
    now = [now dateByAddingTimeInterval:60*60*24*2]; // Add 2 day's worth. 
} 
else if (curDay == 1) // Sun 
{ 
    now = [now dateByAddingTimeInterval:60*60*24]; // Add 1 day's worth. 
} 
+0

您忽略了該問題的輸入。目前的日期只是問題的一半。另一半是我想要下個工作日的日期。如果我希望下一個工作日的日期是未來的一個月,我希望能從那裏找回一個日期,而不是基於今天的日期。例如,當前日期是2015年5月8日星期五下午4點,輸入是6月20日星期六下午3點,輸出應該是6月22日星期一下午3點。你的算法沒有考慮輸入,並會在5月11日星期一返回給我。 –

+0

這將適用於任何提供的日期,我只是使用日期「now」作爲示例(NSDate * now = [NSDate date];)。你的問題表明你將來已經有了一個約會,而你只是想從那天開始找出下一個工作日。現在用任何你在別處創建的NSDate替換我的NSDate *是微不足道的。該算法不負責創建問題描述的輸入以及解決方案。 – Sam

+0

我會盡量簡化這個問題。有兩個輸入。今天的日期和通過的日期。問題是根據這些輸入得到下一個工作日。這就是爲什麼我在我原來的帖子中指出,今天是2015年5月8日星期五下午4點,然後我給了幾個輸入,一些在過去和一些未來。如果你仔細閱讀這個問題,你將會對這個問題有更好的理解,目前你不瞭解實際問題。 –