PHP 生成当月日期
一:按日期顺序排列的数组,而不是按周分组的二维数组
/*日期生成
*day: 日期数字
*date: 完整的日期字符串 (YYYY-MM-DD)
*is_current_month: 是否属于当前月份
*is_prev_month: 是否是上个月的日期
*is_next_month: 是否是下个月的日期
*is_today: 是否是今天
*/
function generateFullCalendar($year = null, $month = null) {// 如果没有提供年份和月份,则使用当前年月$year = $year ?? date('Y');$month = $month ?? date('m');// 获取本月的第一天$firstDayOfMonth = date('Y-m-01', strtotime("$year-$month-01"));// 获取本月的第一天是星期几(0-6,0表示周日)$firstDayOfWeek = date('w', strtotime($firstDayOfMonth));// 获取本月的总天数$daysInMonth = date('t', strtotime($firstDayOfMonth));// 获取上个月的天数$prevMonthDays = date('t', strtotime('-1 month', strtotime($firstDayOfMonth)));// 计算需要显示的上个月日期(补全第一周)$calendar = [];for ($i = $firstDayOfWeek - 1; $i >= 0; $i--) {$day = $prevMonthDays - $i;$prevMonth = date('m', strtotime('-1 month', strtotime($firstDayOfMonth)));$prevYear = date('Y', strtotime('-1 month', strtotime($firstDayOfMonth)));$calendar[] = ['day' => $day,'date' => sprintf("%04d-%02d-%02d", $prevYear, $prevMonth, $day),'is_current_month' => false,'is_prev_month' => true,'is_next_month' => false,'is_today' => false];}// 添加本月的日期for ($day = 1; $day <= $daysInMonth; $day++) {$date = sprintf("%04d-%02d-%02d", $year, $month, $day);$calendar[] = ['day' => $day,'date' => $date,'is_current_month' => true,'is_prev_month' => false,'is_next_month' => false,'is_today' => ($date == date('Y-m-d'))];}// 计算需要显示的下个月日期(只补全最后一周)$totalDaysDisplayed = count($calendar);$daysNeededToCompleteLastWeek = (7 - ($totalDaysDisplayed % 7)) % 7;if ($daysNeededToCompleteLastWeek > 0) {for ($day = 1; $day <= $daysNeededToCompleteLastWeek; $day++) {$nextMonth = date('m', strtotime('+1 month', strtotime($firstDayOfMonth)));$nextYear = date('Y', strtotime('+1 month', strtotime($firstDayOfMonth)));$calendar[] = ['day' => $day,'date' => sprintf("%04d-%02d-%02d", $nextYear, $nextMonth, $day),'is_current_month' => false,'is_prev_month' => false,'is_next_month' => true,'is_today' => false];}}return $calendar;
}
二:按周分组的二维数组
/*日期生成
*day: 日期数字
*date: 完整的日期字符串 (YYYY-MM-DD)
*is_current_month: 是否属于当前月份
*is_prev_month: 是否是上个月的日期
*is_next_month: 是否是下个月的日期
*is_today: 是否是今天
*/
function generateFullCalendar($year = null, $month = null) {// 如果没有提供年份和月份,则使用当前年月$year = $year ?? date('Y');$month = $month ?? date('m');// 获取本月的第一天和最后一天$firstDayOfMonth = date('Y-m-01', strtotime("$year-$month-01"));$lastDayOfMonth = date('Y-m-t', strtotime("$year-$month-01"));// 获取本月的第一天是星期几(0-6,0表示周日)$firstDayOfWeek = date('w', strtotime($firstDayOfMonth));// 获取本月的总天数$daysInMonth = date('t', strtotime($firstDayOfMonth));// 获取上个月的天数$prevMonthDays = date('t', strtotime('-1 month', strtotime($firstDayOfMonth)));// 计算需要显示的上个月日期(补全第一周)$prevMonthDates = [];for ($i = $firstDayOfWeek - 1; $i >= 0; $i--) {$day = $prevMonthDays - $i;$prevMonth = date('m', strtotime('-1 month', strtotime($firstDayOfMonth)));$prevYear = date('Y', strtotime('-1 month', strtotime($firstDayOfMonth)));$prevMonthDates[] = ['day' => $day,'date' => sprintf("%04d-%02d-%02d", $prevYear, $prevMonth, $day),'is_current_month' => false,'is_prev_month' => true,'is_next_month' => false];}// 计算本月的日期$currentMonthDates = [];for ($day = 1; $day <= $daysInMonth; $day++) {$currentMonthDates[] = ['day' => $day,'date' => sprintf("%04d-%02d-%02d", $year, $month, $day),'is_current_month' => true,'is_prev_month' => false,'is_next_month' => false,'is_today' => ($day == date('j') && $month == date('m') && $year == date('Y'))];}// 计算需要显示的下个月日期(只补全最后一周)$totalDaysDisplayed = count($prevMonthDates) + $daysInMonth;$daysNeededToCompleteLastWeek = (7 - ($totalDaysDisplayed % 7)) % 7;$nextMonthDates = [];if ($daysNeededToCompleteLastWeek > 0) {for ($day = 1; $day <= $daysNeededToCompleteLastWeek; $day++) {$nextMonth = date('m', strtotime('+1 month', strtotime($firstDayOfMonth)));$nextYear = date('Y', strtotime('+1 month', strtotime($firstDayOfMonth)));$nextMonthDates[] = ['day' => $day,'date' => sprintf("%04d-%02d-%02d", $nextYear, $nextMonth, $day),'is_current_month' => false,'is_prev_month' => false,'is_next_month' => true];}}// 合并所有日期$allDates = array_merge($prevMonthDates, $currentMonthDates, $nextMonthDates);// 按周分组(确保每周7天)$calendar = array_chunk($allDates, 7);return $calendar;
}