思路:
1、獲取到查詢年份內所有工作日數據數組
2、獲取到查詢開始日期在工作日的索引
3、計算需查詢日期索引
4、獲得查詢日期
/*創建日期類型記錄表格*/CREATE TABLE `tb_workday` (`did` int(11) NOT NULL AUTO_INCREMENT,`exact_date` varchar(32) NOT NULL COMMENT 具體日期:格式date( Ymd (20170205) ,`date_year` varchar(32) NOT NULL COMMENT 具體日期:格式date( Y (2017) ,`date_type` tinyint(2) NOT NULL COMMENT 日期類型:0、工作日;1、特殊工作日;2、法定節假日 ,PRIMARY KEY (`did`)) ENGINE=InnoDB AUTO_INCREMENT=829 DEFAULT CHARSET=utf8 COMMENT= 各年工作日 法定節假日數據
?phphtml' target='_blank'>class work_days * 獲取星期 * @param $date * @return mixed function get_week($date) //強制轉換日期格式 $date_str = date( Y-m-d , strtotime($date)); //封裝成數組 $arr = explode( - , $date_str); //參數賦值 $year = $arr[0]; //月,輸出2位整型,不夠2位右對齊 $month = sprintf( %02d , $arr[1]); //日,輸出2位整型,不夠2位右對齊 $day = sprintf( %02d , $arr[2]); //時分秒默認賦值為0; $hour = $minute = $second = 0; //轉換成時間戳 $strap = mktime($hour, $minute, $second, $month, $day, $year); //獲取數字型星期幾 $number_wk = date( w , $strap); //獲取數字對應的星期 return $number_wk; //自定義星期數組 //$weekArr = array( 星期日 , 星期一 , 星期二 , 星期三 , 星期四 , 星期五 , 星期六 //獲取數字對應的星期 //return $weekArr[$number_wk];
for ($i = 0; $i $days; $i++) { $_list_date[] = date( Y-m-d , $stimestamp + (86400 * $i)); return $_list_date; function curl_post($url, $data = null) $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); if (!empty($data)) { curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($curl); curl_close($curl); return $output; * 更新數據庫指定年份日期數據 * @param $year * @return int function updateDate($year) $startDate = date( Y-m-d , strtotime($year . -01-01 $endDate = date( Y-m-d , strtotime( +1 year , strtotime($startDate)) - 86400); $_list_date = self::getDateFromRange($startDate, $endDate); $url = http://api.goseek.cn/Tools/holiday //自行查找的免費API $m = M( tb_workday $count = 0; foreach ($_list_date as $k = $_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);
* 獲取當年所有工作日 (從數據庫獲取,數據庫無數據則先更新數據) * @param string $year 當年年份 * @return array private function getWorkDays($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) { return self::getWorkDays($year); } else { return false; * 獲取開始日期后第N個工作日具體日期 * @param $startdate string 計算開始日期 需包含年月日信息 * @param $days int 間隔天數 * @return mixed 成功返回 對應日期,失敗返回false public function getNextWorkDate($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) { return date( 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);
$_date_workday = $class- getNextWorkDate($startdate, $days);echo $_date_workday;//2018-10-10
以上就是ThinkPHP中如何獲取指定日期后工作日的具體日期 (代碼詳解)的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答