首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 實現動態日歷生成類

     編輯:PHP 相關知識

本文提供一個功能完整的 PHP 日歷生成函數,支持月份導航、當前日期高亮、跨平台兼容(32/64 位系統)等特性,可直接集成到項目中使用。

核心功能

  • 生成帶導航的 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;
    $mpYear = $year;
    $preMonth = $month - 1;
    if ($preMonth <= 0) {
        $preMonth = 1;
        $mpYear = $pretYear;
    }
    $nextYear = $year + 1;
    $mnYear = $year;
    $nextMonth = $month + 1;
    if ($nextMonth > 12) {
        $nextMonth = 1;
        $mnYear = $nextYear;
    }

    // 日歷表頭
    $html = <<<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>
HTML;

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

    // 循環生成日期單元格
    $day = 1;
    $line = '';
    while ($day <= $lastday) {
        $cday = $year . '-' . $month . '-' . $day;
        $nowWeek = date('N', mktime(0, 0, 0, $month, $day, $year));

        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 .= <<<HTML
    </table>
   </td>
  </tr>
</table>
HTML;

    return $html;
}

/**
 * 檢測是否為 32 位系統
 */
function is32() {
    $is32 = false;
    if (strtotime('2039-10-10') === false) {
        $is32 = true;
    }
    return $is32;
}
?>

使用示例

<?php
// 直接輸出當月日歷
echo myCalender();

// 指定年月
echo myCalender(2024, 12);

// 自定義時區
echo myCalender(2024, 1, 'America/New_York');
?>

擴展建議

  • 添加農曆/節假日數據標註
  • 支持點擊日期觸發 AJAX 事件
  • 整合 CSS 框架美化樣式
  • 增加鍵盤導航支持

此日歷類結構清晰、邏輯完整,適合作為項目中日期選擇組件的基礎實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved