转自: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; } }