萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 生成日歷表格:myCalender 函數完整實現與調用示例

功能特性

  • 指定年月生成 HTML 表格日曆。
  • 支持上一年/月、下一年/月、回到今天導航。
  • 高亮顯示當天(紅色)。
  • 周六/周日區分顏色(橙色背景)。
  • 自動處理 32 位系統時間戳範圍限制(1970-2038)。
  • 時區可配置(默認 Asia/Shanghai)。

完整函數代碼

<?php
/**
 * 生成日歷 HTML 表格
 * @param int $year 年份 (可空,默認當前年)
 * @param int $month 月份 (可空,默認當前月)
 * @param string $timezone 時區標識符
 * @return string HTML 表格代碼
 */
function myCalender($year = '', $month = '', $timezone = 'Asia/Shanghai') {
    date_default_timezone_set($timezone);

    $year = abs(intval($year));
    $month = abs(intval($month));

    // 32位系統時間戳範圍檢查
    if (is32()) {
        if ($year < 1970 || $year >= 2038) $year = date('Y');
    } else {
        if ($year <= 0) $year = date('Y');
    }
    if ($month <= 0 || $month > 12) $month = date('m');

    // 導航鏈接計算
    $pretYear = $year - 1;
    $preMonth = $month - 1;
    $mpYear = $year;
    if ($preMonth <= 0) { $preMonth = 12; $mpYear = $pretYear; }

    $nextYear = $year + 1;
    $nextMonth = $month + 1;
    $mnYear = $year;
    if ($nextMonth > 12) { $nextMonth = 1; $mnYear = $nextYear; }

    // 表格頭部
    $html = "<table width=\"500\" border=\"1\">
    <tr align=\"center\">
        <td><a href=\"?y=$pretYear\">上一年</a></td>
        <td><a href=\"?y=$mpYear&m=$preMonth\">上一月</a></td>
        <td><a href=\"?\">回到今天</a></td>
        <td><a href=\"?y=$mnYear&m=$nextMonth\">下一月</a></td>
        <td><a href=\"?y=$nextYear\">下一年</a></td>
    </tr>
    <tr align=\"center\">
        <td colspan=\"5\">{$year}年{$month}月</td>
    </tr>
    <tr>
        <td colspan=\"5\">
            <table width=\"100%\" border=\"1\">
                <tr align=\"center\">
                    <td style=\"background-color:#DAF0DD;\">星期一</td>
                    <td style=\"background-color:#DAF0DD;\">星期二</td>
                    <td style=\"background-color:#DAF0DD;\">星期三</td>
                    <td style=\"background-color:#DAF0DD;\">星期四</td>
                    <td style=\"background-color:#DAF0DD;\">星期五</td>
                    <td style=\"background-color:#F60;color:#fff;font-weight:bold;\">星期六</td>
                    <td style=\"background-color:#F60;color:#fff;font-weight:bold;\">星期天</td>
                </tr>";

    // 當月最後一天
    $lastday = date('j', mktime(0, 0, 0, $nextMonth, 0, $year));
    $currentDay = date('Y-m-j');

    // 循環輸出日期
    $day = 1;
    $line = '';
    while ($day <= $lastday) {
        $cday = "$year-$month-$day";
        $nowWeek = date('N', mktime(0, 0, 0, $month, $day, $year)); // 1=Mon ... 7=Sun

        if ($day == 1) {
            $line = '<tr align="center">';
            $line .= str_repeat('<td> </td>', $nowWeek - 1); // 填充首行前空單元格
        }

        $style = ($cday == $currentDay) ? 'style="color:red;"' : '';
        $line .= "<td $style>$day</td>";

        if ($nowWeek == 7) { // 週日結束換行
            $line .= '</tr>';
            $html .= $line;
            $line = '<tr align="center">';
        }

        if ($day == $lastday) { // 月底結束
            if ($nowWeek != 7) {
                $line .= str_repeat('<td> </td>', 7 - $nowWeek); // 填充尾部空單元格
            }
            $line .= '</tr>';
            $html .= $line;
            break;
        }
        $day++;
    }

    $html .= "            </table>
        </td>
    </tr>
</table>";

    return $html;
}

/** 檢測 32 位系統 */
function is32() {
    return strtotime('2039-10-10') === false;
}

// 調用示例
$year = isset($_GET['y']) ? intval($_GET['y']) : '';
$month = isset($_GET['m']) ? intval($_GET['m']) : '';
echo myCalender($year, $month);
?>

使用示例

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>PHP 日歷</title></head><body>
<h2>PHP 動態日歷</h2>
<?php
require_once 'calendar.php'; // 假設函數在單獨文件
$y = isset($_GET['y']) ? intval($_GET['y']) : '';
$m = isset($_GET['m']) ? intval($_GET['m']) : '';
echo myCalender($y, $m);
?>
</body></html>

擴展建議

  1. 農曆/節假日**:集成農曆轉換庫,標註節氣、法定節假日。
  2. 事件標記**:數據庫讀取當月事件,在對應 `` 追加標記/彈窗。
  3. AJAX 切換月份**:無刷新載入,體驗更流暢。
  4. 響應式布局**:CSS Grid/Flexbox 替代 ``,移動端友好。
  5. DateTime 類重寫**:使用 `DateTime`、`DatePeriod` 替代 `date()`/`mktime()`,更面向對象、支持更大年份范圍。
  6. copyright © 萬盛學電腦網 all rights reserved