php工作日,php计算N个工作日之后的方法

需求点

给定一个当前日期N,计算m个工作日后的天数x

话不多说,上代码

//节假日 需要手动维护配置文件或者放入db中

$holiday=[

'2017-04-29',

'2017-04-30',

'2017-05-01',

'2017-05-06',

'2017-05-07',

'2017-05-13',

'2017-05-14',

'2017-05-20',

'2017-05-21',

'2017-05-28',

'2017-05-29',

'2017-05-30',

'2017-06-03',

'2017-06-04',

'2017-06-10',

'2017-06-11',

'2017-06-17',

'2017-06-18',

'2017-06-24',

'2017-06-25',

'2017-07-01',

'2017-07-02',

'2017-07-08',

'2017-07-09',

'2017-07-15',

'2017-07-16',

'2017-07-22',

'2017-07-23',

'2017-07-29',

'2017-07-30',

'2017-08-05',

'2017-08-06',

'2017-08-12',

'2017-08-13',

'2017-08-19',

'2017-08-20',

'2017-08-26',

'2017-08-27',

'2017-09-02',

'2017-09-03',

'2017-09-09',

'2017-09-10',

'2017-09-16',

'2017-09-17',

'2017-09-23',

'2017-09-24',

'2017-10-01',

'2017-10-02',

'2017-10-03',

'2017-10-04',

'2017-10-05',

'2017-10-06',

'2017-10-07',

'2017-10-08',

'2017-10-14',

'2017-10-15',

'2017-10-21',

'2017-10-22',

'2017-10-28',

'2017-10-29',

'2017-11-04',

'2017-11-05',

'2017-11-11',

'2017-11-12',

'2017-11-18',

'2017-11-19',

'2017-11-25',

'2017-11-26',

'2017-12-02',

'2017-12-03',

'2017-12-09',

'2017-12-10',

'2017-12-16',

'2017-12-17',

'2017-12-23',

'2017-12-24',

'2017-12-30',

'2017-12-31',

//...

];

function afterWorkDay($start_timestamp='',$add_workday_num='',$holiday=[]){

// 如果加天数的的时候遇到休假日,则代表需要额外增加的天数

$extra_day=0;

//已经实际增加的天数的数量

$workday_added_num=0;

for($i=1;$i<=$add_workday_num;$i++){

$detail_time=date('Y-m-d H:i:s',($start_timestamp)+$i*(60*60*24));

$workday_added_num++;

//只取宽泛的月日就好

$wide_date=date('Y-m-d',strtotime($detail_time));

// 如果其中一天在holiday中

if(in_array($wide_date, $holiday)){

//取消已经增加的天数,后面再继续加上

$workday_added_num--;

// 需要额外增加的天数

$extra_day++;

}

//如果加完之后的日期的下一天还是休息日,需要再次增加额外增加天数

$extra_judge=date("Y-m-d",strtotime($wide_date)+86400);

}

//如果需要增加的天数与实际已经增加的天数不相等

if($add_workday_num!=$workday_added_num){

while (in_array($extra_judge, $holiday)) {

$extra_day++;

$extra_judge=date("Y-m-d",strtotime($extra_judge)+86400);

}

}

//实际应增加总天数=已经增加天数+(应增加天数-已经增加天数)+额外需要增加天数

$add=$workday_added_num+($add_workday_num-$workday_added_num)+$extra_day;

return date('Y-m-d H:i:s',($start_timestamp)+$add*(60*60*24));

// $result_date=date('Y-m-d',($start_timestamp)+$add*(60*60*24));

// 如果这个结果也是在假期日内

// while (in_array($result_date, $holiday)) {

// $result_date=date('Y-m-d',strtotime($result) +86400);

// $result=date('Y-m-d H:i:s',strtotime($result) +86400);

// }

}

// xx发起时间 6月1日是周四,

$time=mktime('13','30','56','06','01','2017');

$start_timestamp=$time;

// var_dump($start_timestamp);

//计算两个工作日后的时间

echo afterWorkDay($start_timestamp,2,$holiday);//out put 2017-06-05 13:30:56

需要手动维护法定节假日及周末

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值