直接上代码先标记下,回头再优化和详解
/** * 获取每天的开始和结束时间 * @method getDay * deep * @param [string] $year [年份] * @param [string] $weekday [周] * @return [array] $data [该周内每天的开始和结束时间] */ public function getDay($year,$weekday) { //一年时间 $yearFirstDay = $year.'-01-01 00:00:00'; $yearEndDay = $year.'-12-31 23:59:59'; //第一天是星期几 $week = date('N',strtotime($yearFirstDay)); $days = 8-$week; $firstWeekendDay = date('Y-m-d H:i:s',strtotime($year.'-01-0'.$days.' 23:59:59')); $weeks = array(); $weeks[1]['week_start'] = strtotime($yearFirstDay); $weeks[1]['week_end'] = strtotime($year.'-01-0'.$days.' 23:59:59'); //各周开始和结束时间戳 $days2 = ((strtotime($yearEndDay)-$weeks[1]['week_end'])/86400)/7; $days3 = (int)floor($days2); $length = $days3+1; for($i=2;$i<=$length;$i++) { $weeks[$i]['week_start'] = 1+$weeks[$i-1]['week_end']; $weeks[$i]['week_end'] = 604800+$weeks[$i-1]['week_end']; } //最后一周的开始和结束时间 $remainder = ((strtotime($yearEndDay)-$weeks[1]['week_end'])/86400)%7; if($remainder > 0) { $data = []; $data['week_start'] = 1+end($weeks)['week_end']; $data['week_end'] = ($remainder*86400)+end($weeks)['week_end']; array_push($weeks,$data); } //获取每天的开始和结束时间 if (array_key_exists($weekday,$weeks)) { $wEnd = $weeks[$weekday]['week_end']; $data = []; $data[1]['start'] = $weeks[$weekday]['week_start']; $data[1]['end'] = $data[1]['start'] + 86399; for ($i=2; $i < 8; $i++) { $data[$i]['start'] = $data[$i-1]['end'] + 1; $data[$i]['end'] = $data[$i-1]['end']+86400; } return $data; }; } /** * 动态获取某月的周的时间 * @method getWeekCount * deep * @param [string] $year [年] * @param [string] $month [月] * @return [array] $weekArray [每周开始和结束周时间戳] */ public function getWeekCount($year, $month) { $time = $year . '-' . $month; $weekday = date('w', strtotime($time)); //获取1号是周几 if ($weekday == 1) { //1号是周一 $firstWeekDay = 7; } elseif ($weekday == 0) { //1号是周日 $firstWeekDay = 1; } else { $firstWeekDay = 8 - $weekday; } $weekArray = []; $endThisweek = mktime(23, 59, 59, $month, $firstWeekDay, $year); $weekArray[1] = [strtotime($time), $endThisweek]; $weeknum = 1 + ceil((date('t', $month) - $firstWeekDay) / 7); //获取到本月一共有几周 $beginThisWeek = mktime(0, 0, 0, $month, $firstWeekDay + 1, $year); $endThisweek = mktime(23, 59, 59, $month, $firstWeekDay + 7, $year); for ($i = 2; $i <= $weeknum; $i++) { $weekArray[$i] = [($beginThisWeek + ($i - 2) * 7 * 86400), ($endThisweek + ($i - 2) * 7 * 86400)]; } //获取每周的时间节点 $weekArray[$weeknum] = [$weekArray[$weeknum][0], mktime(23, 59, 59, $month, date('t', strtotime($time)), $year)]; return [$weekArray]; } /** * 动态获取每月的开始和结束时间戳 * @method getMonth * deep * @param [string] $year [年份] * @return [array] $data [每月的开始和结束] */ public function getMonth($year) { $year = str_pad(intval($year), 4, "0", STR_PAD_RIGHT); $data = []; for ($i=1; $i <=12 ; $i++) { $month = sprintf("%02d", intval($i)); $month>12 || $month<1 ? $month=1 : $month=$month; $mStart = strtotime($year . $month . "01000000"); $mStartCode = date("Y-m-01", $mStart); $mEnd = strtotime(date('Y-m-d 23:59:59', strtotime("$mStartCode +1 month -1 day"))); $data[$i]['mstart'] = $mStart; $data[$i]['mend'] = $mEnd; } return $data; }