一:按日期顺序排列的数组,而不是按周分组的二维数组
/*日期生成
*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;
}