【问题标题】:Add two business days to a date array excluding holiday dates将两个工作日添加到日期数组,不包括假期日期
【发布时间】:2017-07-24 22:26:21
【问题描述】:

我正在尝试将 2 个工作日添加到日期中,但我也想排除数组中的日期。

要排除的日期数组:

$bankHolidays = array();
foreach($obj as $e) {
    if($e->division == 'england-and-wales') {
        foreach($e->events as $events) {
            $bankHolidays[] = $events->date;
        }
    }
}

到目前为止增加 2 个工作日

$ret = date('d-m-Y', strtotime($bill["charge_customer_at"]. ' +2 weekdays'));

如何包含要排除的日期数组?

例如,如果我的日期是 2017-07-19 并且我想添加 2 周天,那将输出 2017-07-21

但是,如果 2017-07-21 在我的数组中,它应该跳过这个日期并继续添加 2 个工作日,因此输出最终将是 2017-07-24,因为周末也是如此。

【问题讨论】:

  • 我已经阅读了你的问题几次,但不明白你想要的输出。如果您提供所需输出的示例,我很确定我可以做到这一点。
  • 检查我的更新,我提供了一个例子。我希望这是有道理的
  • 让您的脚本返回日期 + 2 天。做一个“假期检查”,看看你的假期数组中是否存在这个新日期。如果是这样,则添加一天。然后你只需要验证它是否是工作日。如果生成的日期是星期六或星期日,则将日期添加 1 天,然后重新运行整个事情(从假期检查开始)。听起来你理论上已经有了?只需使用in_array() 方法。

标签: php date


【解决方案1】:

您可以做一些简单的事情,例如使用 while 循环。

$date = '2017-07-25';
$reserved = ['2017-07-27', '2017-07-28'];
$days = 2;

while ($days > 0) {
    $date = date('Y-m-d', strtotime($date . ' +1 weekday'));
    if (! in_array($date, $reserved)) $days--;
}

var_dump($date);

【讨论】:

  • 当OP想要添加工作日时,这个解决方案是添加+1 day
  • 好地方。固定。
  • 哇。我从来没有想过要那样做。 +1 只是为了它的非正统,别管你想出它有多快。
  • @AuntJamaima - 你为什么说它不正统?
  • 不确定它对你有多相关,但有一个用于检查具体语言环境的假期的库:heiglandreas/holidayChecker。它将允许您以某种方式检查所选工作日是否不是公共假期。
【解决方案2】:

查找具有给定偏移量的下一个工作日函数。

以下内容基本上采用您的给定日期、您想要跳过的天数(在您的情况 2 中)以及您在问题中显示的预填充的假期数组。如果您的日期之后的工作日是假期,它会增加一天并再次检查。

function nextBusinessDay($date, $daysToSkip,$holidays){
    $day = date('Y-m-d',strtotime($date. ' + '.$daysToSkip.' weekday'));
    if(!in_array($day,$holidays)){
         return $day;
    } else {
        return nextBusinessDay(date('Y-m-d',strtotime($date.' +1 day')), $daysToSkip,$holidays);
    }
}

$date = '2017-07-19';
$holidays = ['2017-07-21'];
echo nextBusinessDay($date,2,$holidays);//returns 2017-07-24

$date = '2017-07-19';
$holidays = ['2017-07-21', '2017-07-24'];
echo nextBusinessDay($date,2,$holidays);//returns 2017-07-25 like if it were a 4 day weekend

抱歉,我花了一段时间才有机会查看并发布一些内容。这应该适合你。我的理解是,您需要返回距给定日期两天后的第一个营业日期,而不是继续添加两个星期,直到日期不在您的假期数组中。如果你真的想继续增加 2 天,或者不管多少天,然后改变

return nextBusinessDay(date('Y-m-d',strtotime($date.' +1 day')), $daysToSkip,$holidays);

return nextBusinessDay(date('Y-m-d',strtotime($date.' +'.$daysToSkip.' day')), $daysToSkip,$holidays);

【讨论】:

  • 感谢您将其放在一起 - 它似乎返回了正确的日期,但我实际上是在另一个函数中运行它,我认为它会导致在 2 个函数中返回值时出现问题 - 这会导致问题吗?
  • 你的第二个功能是什么? Return 只是意味着函数的值是返回中的任何值。您可以嵌套任意数量的函数。告诉我你有什么,我可以告诉你如何让它发挥作用。
猜你喜欢
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
相关资源
最近更新 更多