从日期中添加或减去天数时如何避免周末或节假日[重复]

Posted

技术标签:

【中文标题】从日期中添加或减去天数时如何避免周末或节假日[重复]【英文标题】: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 是在周日......好吧,我想你明白我的意思了。 我到底怎么才能得到我想要的结果?

【问题讨论】:

【参考方案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 日星期五结束。

以上是关于从日期中添加或减去天数时如何避免周末或节假日[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从日期中添加或减去天数的算法?

从日期计算中排除周末和自定义日期(即假期)

日期选择器国定假日计数

PHP 从日期添加或减去天数

从日期中减去天数,然后将结果舍入到 Redshift 中的周末日期

如何使用 postgresql/netezza 从日期时间中减去天数或月数