/** * @param $year_month 需要计算的年月 * @param $how_many 第几个日期 * @param $what_week 选择周几 * @return array|string[] */ public function generation($year_month,$how_many,$what_week) { \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; /*$year_month = "2021-07"; $how_many = '3'; //选择第几个 1.第一个····5第五个、6最后一个 //1周一,2周二,3周三,4周四,5周五,6周六,7周日,8自然日,9工作日,10周末 $what_week = '9'; //选择周几 */ if ($what_week < 7){//周一-周六 $what_week = $what_week; $week_info = $this->get_week($how_many,$what_week,$year_month); $data =array( 'start_time' => $week_info, 'end_time' =>$week_info ); return $data; }elseif ($what_week == 7){//周日 $what_week = 0; $week_info = $this->get_week($how_many,$what_week,$year_month); $data =array( 'start_time' => $week_info, 'end_time' =>$week_info ); return $data; }elseif ($what_week == 8){//返回当月一号 if ($how_many <= 5){ $week_info = $year_month.'-0'.$how_many; }else{ $week_info = date('Y-m-d', strtotime(date('Y-m-01', strtotime($year_month.'-01')) . ' 1 month -1 day')); } $data =array( 'start_time' => $week_info, 'end_time' =>$week_info ); return $data; }elseif ($what_week == 9){//工作日计算 $start_time = $year_month.'-01'; //當月第一天 $end_time = date('Y-m-d', strtotime(date('Y-m-01', strtotime($year_month.'-01')) . ' 1 month -1 day')); $info = $this->get_work_day($start_time,$end_time);//获取当月所有的工作日 $workday = $info['workday']; if ($how_many <= 5){ //输入的第几周大于实际的周数,默认使用最后一周 $week_info = $workday[$how_many-1]; }else{ $work_num = count($workday); $week_info = $workday[$work_num-1]; } $data =array( 'start_time' => $week_info, 'end_time' =>$week_info ); return $data; }elseif ($what_week == 10){ //获取周末 //周六 $start_time = $this->get_week($how_many,6,$year_month); $start = explode('-',$start_time); //周日 $end_time = $this->get_week($how_many,0,$year_month); $end = explode('-',$end_time); if ($start[2] >$end[2]){ $day = $end[2]-1; $end_time = $end_time; $start_time = $end[0].'-'.$end[1].'-'.$day; } $data =array( 'start_time' => $start_time, 'end_time' =>$end_time ); return $data; } } /** * @param $what_week * @param $week * @param $year_month * @return mixed 计算第几个周几的日期 */ public function get_week($week,$what_week,$year_month){ if(empty($year_month)){ $year_month = date("Y-m"); } $maxDay = date('t', strtotime($year_month."-01")); //计算出当前月份所有周几 $mondays = array(); for($i=1; $i<=$maxDay; $i++){ if(date('w', strtotime($year_month."-".$i)) == $what_week){ $mondays[] = $year_month."-".($i>9?'':'0').$i; } } //获取当月有几个周几 if ($week >= count($mondays)){ //输入的第几周大于实际的周数,默认使用最后一周 $week_num = count($mondays); $week_info = $mondays[$week_num-1]; }else{ $week_info = $mondays[$week-1]; } return $week_info; } /** * @param $start_time 月份第一天 * @param $end_time 月份最后一天 * @return array|array[] 每个月所有的工作日和周六周日日期 */ function get_work_day($start_time,$end_time) { $start_time = empty($start_time)?time():strtotime($start_time); $end_time = empty($end_time)?time():strtotime($end_time)+86400;//最后一天也算 if($end_time<=$start_time){ return array(); } $days = ($end_time - $start_time)/86400; $work_day_array = array();//工作日 $Weekend_day_array = array();//周末 for ($i=0; $i < $days ; $i++) { $timer = $start_time + 86400*$i; $num= date("N",$timer); if($num == 6 || $num == 7) { $Weekend_day_array[] = date('Y-m-d',$timer); }else{ $work_day_array[] = date('Y-m-d',$timer); } } return array( 'workday'=>$work_day_array, //所有工作日 //'weekend'=>$Weekend_day_array //所有周末 ); }