【问题标题】:How to avoid weekends or holidays when adding or subtracting days from a date [duplicate]从日期中添加或减去天数时如何避免周末或节假日[重复]
【发布时间】:2013-12-19 10:27:03
【问题描述】:

我在许多格式中看到过这个问题,包括 C/C+ 和 Javascript。我也以相反的形式看到了这个问题...How to calculate a span between dates excluding weekends or holidays。但是,假设您已经有一个特定的日期。例如,2014-01-04 我想计算一个日期 ($diff) 之前三个工作日,不包括任何周末或节假日。三天的直接减法将导致2014-01-01,所以我们知道这行不通。所以,我再减去一天,得到2013-12-31 - 再次,不好。另一个尝试给了我们2013-12-30。最后,我们在两个日期之间有三个实际工作日!但是,我们只是说就像 2014 年一样2013-12-30 是在周日......好吧,我想你明白我的意思了。 我到底怎么才能得到我想要的结果?

【问题讨论】:

    标签: php sql date


    【解决方案1】:

    好吧,我已经编写了一个漂亮的 PHP 函数来解决这个难题,并希望与我的程序员同事分享它,并接受对其构成的建设性批评。

    function onlyWorkDays( $d ) {
        $holidays = array('2013-12-25','2013-12-31','2014-01-01','2014-01-20','2014-02-17','2014-05-26','2014-07-04','2014-09-01','2014-10-13','2014-11-11','2014-11-27','2014-12-25','2014-12-31');
        while (in_array($d->format("Y-m-d"), $holidays)) { // HOLIDAYS
            $d->sub(new DateInterval("P1D"));
        }
        if ($d->format("w") == 6) { // SATURDAY
            $d->sub(new DateInterval("P1D"));
        }
        if ($d->format("w") == 0) { // SUNDAY
            $d->sub(new DateInterval("P2D"));
        }
        return $d;
    }
    

    【讨论】:

    • 周末检查也必须在while循环中。使用“2015-12-27”测试您的功能,您将在 12 月 25 日星期五结束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多