功能特性
- 指定年月生成 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>
擴展建議
- 農曆/節假日**:集成農曆轉換庫,標註節氣、法定節假日。
- 事件標記**:數據庫讀取當月事件,在對應 `
` 追加標記/彈窗。
- AJAX 切換月份**:無刷新載入,體驗更流暢。
- 響應式布局**:CSS Grid/Flexbox 替代 `
`,移動端友好。
- DateTime 類重寫**:使用 `DateTime`、`DatePeriod` 替代 `date()`/`mktime()`,更面向對象、支持更大年份范圍。
copyright © 萬盛學電腦網 all rights reserved
|