php-获取从今天开始计算第5个工作日的日期

<?php
/**
* @author: hirry
* @email: ljhynlp@126.com
* @time: 2013-06-05
* @words: 获取从今天开始退回的第n个工作日的日期
*/

//定义当前时间
define("TODAY",date("Y-m-d"));
//定义要获取第几个工作日的日期
define("NUMDAY",'5');

 

//计算出第5天的时间
$fifthday = get_num_date(TODAY, NUMDAY);
//获取第5个工作日
echo "第5个工作日期是:";
echo get_fifth_work_date(TODAY, $fifthday);

 


//计算第n天的日期
function get_num_date($startDate, $numDate){
 return date("Y-m-d", strtotime($startDate) + $numDate*3600*24);
}

//计算第5个工作日期
function get_fifth_work_date($toDay, $endday){
 $num = check_work_day_num($toDay, $endday);
 if($num==5){
  echo $endday;
 }else{
  $endday2 = get_num_date(TODAY, NUMDAY+(NUMDAY-$num));
  get_fifth_work_date($toDay, $endday2);
 }
}

//计算工作日函数
function check_work_day_num($toDay, $endday){
 $starttime = $toDay;
 $endtime = $endday;

 $starttime=date("z",mktime(0,0,0,substr($starttime,5,2),substr($starttime,8,2),substr($starttime,0,4))); $endtime=date("z",mktime(0,0,0,substr($endtime,5,2),substr($endtime,8,2),substr($endtime,0,4)));
 $alltime=$endtime-$starttime+1;

 //节假日的日期数据,目前按照年份配置就可以了
 $ordainrest["2013"] = "05-01&3|&&|06-10&3|&&|10-01&5";
 $ordainrest["2014"] = "05-01&3|&&|06-10&3|&&|10-01&5";

 //计算去掉节假日的天数
 $tmpa=explode("|&&|",$ordainrest[date("Y")]);
 for($Tmpb=0;$Tmpb<count($tmpa);$Tmpb++){
  $tmpc=explode("&",$tmpa[$Tmpb]);
  $tmpsize=date("z",mktime(0,0,0,substr($tmpc[0],0,2),substr($tmpc[0],3,2),date("Y")));
  if($tmpsize>=$starttime && $tmpsize<=$endtime){
   $alltime=$alltime-$tmpc[1];
   //从总的工作日中去掉法定日期
  }
 }
 
 //计算去掉周末的天数
 $weekdaynum = get_weekend_days($toDay, $endday);
 $work_day_num = $alltime-($weekdaynum-1);
 return $work_day_num;
}


//获取周末天数
function get_weekend_days($start_date,$end_date,$is_workday = false){
 if (strtotime($start_date) > strtotime($end_date)) list($start_date, $end_date) = array($end_date, $start_date);
  $start_reduce = $end_add = 0;
  $start_N = date('N',strtotime($start_date));
  $start_reduce = ($start_N == 7) ? 1 : 0;
  $end_N = date('N',strtotime($end_date));
  in_array($end_N,array(6,7)) & $end_add = ($end_N == 7) ? 2 : 1;
  $alldays = abs(strtotime($end_date) - strtotime($start_date))/86400 + 1;
  $weekend_days = floor(($alldays + $start_N - 1 - $end_N) / 7) * 2 - $start_reduce + $end_add;
  if ($is_workday){
   $workday_days = $alldays - $weekend_days;
   return $workday_days;
  }
 return $weekend_days;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值