給定一個當前日期N,計算m個工做往後的天數xphp
<?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