根据当前日期算出N个工作日之后的日期 Posted on 2017-05-31 | Edited on 2019-11-03 | In PHP | Comments: 需求:给定一个日期,要求算出N天(工作日)后的日期 直接上代码 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 <?php//节假日 需要手动维护配置文件或者放入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 2017国务院放假权威安排