php获取调休时长,php如何计算指定工作日后的日期?

提供个思路。

1、从聚合数据上“获取当前假期列表API”抓取出当年的假期并存储到表里;

2、从stackexchange.com借鉴了一个“计算指定工作日后的日期”的类库,参考修改如下(1步骤获取的假期列表为此类库的一个参数$holidays):

class BusinessDaysCalculator {

const MONDAY = 1;

const TUESDAY = 2;

const WEDNESDAY = 3;

const THURSDAY = 4;

const FRIDAY = 5;

const SATURDAY = 6;

const SUNDAY = 7;

/**

* @param DateTime $startDate Date to start calculations from

* @param DateTime[] $holidays Array of holidays, holidays are no conisdered business days.

* @param DateTime[] $nonBusinessDays Array of days of the week which are not business days.

* @param DateTime[] $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;

}

}

$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 BusinessDaysCalculator(

new DateTime(), //当前时间

$holidays,

[BusinessDaysCalculator::SATURDAY, BusinessDaysCalculator::SUNDAY],

$specialBusinessDay

);

$calculator->addBusinessDays(2); // 2个工作日后的时间

$afterBusinessDay=$calculator->getDate();

echo $afterBusinessDay;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值