PHP 生成当月日期

发布于:2025-06-20 ⋅ 阅读:(11) ⋅ 点赞:(0)

 一:按日期顺序排列的数组,而不是按周分组的二维数组


/*日期生成
*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;
}


网站公告

今日签到

点亮在社区的每一天
去签到