ThinkPHP中获取指定日期后工作日的具体日期方法
思路:
1、获取到查询年份内所有工作日数据数组
2、获取到查询开始日期在工作日的索引
3、计算需查询日期索引
4、获得查询日期
/*创建日期类型记录表格*/ CREATETABLE`tb_workday`( `did`int(11)NOTNULLAUTO_INCREMENT, `exact_date`varchar(32)NOTNULLCOMMENT'具体日期:格式date("Ymd");(20170205)', `date_year`varchar(32)NOTNULLCOMMENT'具体日期:格式date("Y");(2017)', `date_type`tinyint(2)NOTNULLCOMMENT'日期类型:0、工作日;1、特殊工作日;2、法定节假日', PRIMARYKEY(`did`) )ENGINE=InnoDBAUTO_INCREMENT=829DEFAULTCHARSET=utf8COMMENT='各年工作日&法定节假日数据'
$_date){ $_ret=0; $_date=date('Ymd',strtotime($_date)); $_post_data=array('date'=>$_date); $_ret_curl=curl_post($url,$_post_data); $_ret_curl=json_decode($_ret_curl,true); //工作日 if($_ret_curl['data']==0){ $dateData['exact_date']=$_date; $dateData['date_year']=$year; $dateData['date_type']=0; $_ret=$m->add($dateData)?1:0; unset($dateData); //工作日判断是否为周末 if(in_array(self::get_week($_date),array(0,1))){ //特殊工作日 $dateData['exact_date']=$_date; $dateData['date_year']=$year; $dateData['date_type']=1; $_ret=$m->add($dateData)?1:0; unset($dateData); } } //法定节假日 if($_ret_curl['data']==2){ $dateData['exact_date']=$_date; $dateData['date_year']=$year; $dateData['date_type']=2; $_ret=$m->add($dateData)?1:0; unset($dateData); } //休息日(周末)暂不处理 /*if($_ret_curl['data']==1){ }*/ $_ret&&$count++; unset($_date,$_post_data,$_ret_curl,$_ret); } return$count; } /** *获取当年所有工作日(从数据库获取,数据库无数据则先更新数据) *@paramstring$year当年年份 *@returnarray */ privatefunctiongetWorkDays($year) { $m=M('tb_workday'); $map['date_year']=$year; $map['date_type']=0; $DateArray=$m->field('exact_date')->where($map)->select(); if(!empty($DateArray)){ $DateArray=array_column($DateArray,'exact_date'); return$DateArray; }else{ //更新数据库工作日数据 $ret=self::updateDate($year); if($ret>0){ returnself::getWorkDays($year); }else{ returnfalse; } } } /** *获取开始日期后第N个工作日具体日期 *@param$startdatestring计算开始日期需包含年月日信息 *@param$daysint间隔天数 *@returnmixed成功返回对应日期,失败返回false */ publicfunctiongetNextWorkDate($startdate,$days) { $year=date('Y',strtotime($startdate)); $startdate=date('Y-m-d',strtotime($startdate)); $workDays=$this->getWorkDays($year); $search_key=array_search(date('Ymd',strtotime($startdate)),$workDays); if($search_key===false){//查询日期为非工作 //获取查询日期前最近工作日 $m=M('tb_workday'); $map['date_year']=$year; $map['date_type']=0; $map['DATE_FORMAT(`exact_date`,\'%Y-%m-%d\')']=array('LT',$startdate); $_search_date=$m->where($map)->order('`exact_date`DESC')->getField('exact_date'); $search_key=array_search($_search_date,$workDays); unset($m,$map,$_search_date); } $t_key=$search_key+$days; if($t_key<=count($workDays)-1){ returndate('Y-m-d',strtotime($workDays[$t_key])); }else{ //查询日期已跨年 $n_days=$days-(count($workDays)-1-$search_key); $next_year=$year+1; return$this->getNextWorkDate($next_year.'-01-01',$n_days-1); } } } $startdate='2018-09-28'; $days=5; $class=newwork_days(); $_date_workday=$class->getNextWorkDate($startdate,$days); echo$_date_workday;//2018-10-10
以上代码大家可以在本地测试一下,感谢大家对毛票票的支持。