Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSDate获取未来的下一个工作日_Ios_Objective C_Algorithm_Date_Nsdate - Fatal编程技术网

Ios NSDate获取未来的下一个工作日

Ios NSDate获取未来的下一个工作日,ios,objective-c,algorithm,date,nsdate,Ios,Objective C,Algorithm,Date,Nsdate,我的问题的逻辑是一口之多,我已经想出了一个解决办法。我的解决方案发布在下面。我想看看是否有人能想出一个更有效/更简单的解决方案 该方法应该返回下一个,从现在开始的未来,发生在给定日期的工作日。输入日期和输出日期之间应保留时间 例如,今天是2015年5月8日星期五下午4:00: 2015年的所有投入和产出如下: +---------------------------+---------------------------+ | Input |

我的问题的逻辑是一口之多,我已经想出了一个解决办法。我的解决方案发布在下面。我想看看是否有人能想出一个更有效/更简单的解决方案

该方法应该返回下一个,从现在开始的未来,发生在给定日期的工作日。输入日期和输出日期之间应保留时间

例如,今天是2015年5月8日星期五下午4:00: 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;
}

在发布解决方案之前,使用上面的输入/输出表测试您的逻辑。

没有理由不将逻辑放入循环中,因为它最多会循环两次(如果当天是星期六)

以下是一个解决方案,用于确定当前日期是否为周末:

然后,我们可以调用此方法,检查返回的NSInteger是否为sat或sun,然后再次运行它:

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];
}
如果你真的想删除循环,你可以检查它是否是Sat并增加2天,或者是Sun并增加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.
}

4月7日星期二的输入如何给出5月星期一的输出?为什么不在4月8日星期三呢?第二行也是一样——为什么不在5月8日星期五注意以下内容:“对于所有示例,今天是2015年5月8日星期五下午4:00:所有输入和输出都在2015年:”。其中一个要求是,它必须是从今天开始的将来,返回的日期不能是过去。我投票将此问题作为离题结束,因为它属于codereview.stackexchange.com。@maddy如果您前往,您可以看到它符合主题部分。仅仅因为它还符合相关站点上的另一个主题部分,并不意味着它不符合此站点上的主题部分。您忽略了问题的输入。目前的日期只是问题的一半。另一半是我想要的下一个工作日的日期。如果我希望下一个工作日的日期是一个月以后,我希望从那里得到一个日期,而不是一个基于今天的日期。例如,当前日期为2015年5月8日星期五下午4:00,输入为6月20日星期六下午3:00,输出为6月22日星期一下午3:00。您的算法不考虑输入,将于5月11日星期一返回给我。这将适用于任何提供的日期,我只是以日期“现在”为例(NSDate*now=[NSDate date];)。你的问题表明你在未来已经有了一个日期,你只是想知道从那个日期开始的下一个工作日。现在用您在其他地方创建的任何NSDate替换我的NSDate*是很简单的。算法不负责为问题描述和解决方案创建输入。我将尝试简化问题。有两个输入。今天的日期和传入的日期。问题是根据这些输入获取下一个工作日。这就是为什么我在我的原始帖子中指定今天是2015年5月8日星期五下午4:00,然后我给出了一些输入,一些是过去的,一些是未来的。如果你仔细阅读问题,你会对问题有更好的理解,目前你还不了解实际问题。
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.
}