php如何计算指定工作日后的日期?

转自:https://segmentfault.com/q/1010000008208219?sort=created

1、从聚合数据上“获取当前假期列表API”抓取出当年的假期并存储到表里;
2、从stackexchange.com借鉴了一个“计算指定工作日后的日期”的类库,参考修改如下(1步骤获取的假期列表为此类库的一个参数$holidays):

php如何计算指定工作日后的日期?

<?php

namespace common\support;

use DateTime;

/**
 * Class BusinessDaysCalculatorHelper
 * @package common\support
 * $holidays = ["2017-01-27", "2017-01-28", "2017-01-29", "2017-01-30", "2017-01-31", "2017-02-01", "2017-02-02"];
 * $specialBusinessDay = ["2017-01-22"];//因法定节假日调休而上班的周末,这种情况也算工作日.因为这种情况少,可以通过手动配置
 * $calculator = new BusinessDaysCalculatorHelper(
 * new DateTime(), //当前时间
 * $holidays,
 * [BusinessDaysCalculatorHelper::SATURDAY, BusinessDaysCalculatorHelper::SUNDAY],
 * $specialBusinessDay
 * );
 * $calculator->addBusinessDays(2); // 2个工作日后的时间
 * $afterBusinessDay = $calculator->getDate();
 * echo $afterBusinessDay;
 */
class BusinessDaysCalculatorHelper
{
    const MONDAY = 1;
    const TUESDAY = 2;
    const WEDNESDAY = 3;
    const THURSDAY = 4;
    const FRIDAY = 5;
    const SATURDAY = 6;
    const SUNDAY = 7;

    /**
     * @var DateTime
     */
    private $date;
    /**
     * @var array
     */
    private $holidays;
    /**
     * @var array|DateTime[]
     */
    private $nonBusinessDays;
    /**
     * @var array|DateTime[]
     */
    private $specialBusinessDay;

    /**
     * BusinessDaysCalculatorHelper constructor.
     * @param DateTime $startDate Date to start calculations from
     * @param array $holidays Array of holidays, holidays are no conisdered business days.
     * @param array $nonBusinessDays Array of days of the week which are not business days.
     * @param array $specialBusinessDay Array is the special work day.
     */
    public function __construct(DateTime $startDate, array $holidays = [], array $nonBusinessDays = [], array $specialBusinessDay = [])
    {
        $this->date = $startDate;
        $this->holidays = [];
        foreach ($holidays as $holiday) {
            array_push($this->holidays, new DateTime($holiday));
        }
        $this->nonBusinessDays = $nonBusinessDays;
        $this->specialBusinessDay = $specialBusinessDay;
    }

    public function addBusinessDays($howManyDays)
    {
        $i = 0;
        while ($i < $howManyDays) {
            $this->date->modify("+1 day");
            if ($this->isBusinessDay($this->date)) {
                $i++;
            }
        }
    }

    public function getDate()
    {
        return $this->date->format('Y-m-d');
    }

    private function isBusinessDay(DateTime $date)
    {
        if (in_array($date->format('Y-m-d'), $this->specialBusinessDay)) {
            return true; //判断当前日期是否是因法定节假日调休而上班的周末,这种情况也算工作日
        }
        if (in_array((int)$date->format('N'), $this->nonBusinessDays)) {
            return false; //当前日期是周末
        }
        foreach ($this->holidays as $day) {
            if ($date->format('Y-m-d') == $day->format('Y-m-d')) {
                return false; //当前日期是法定节假日
            }
        }
        return true;
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值