核心功能
- 閏年判斷邏輯
- 月份天數動態計算(含 2 月閏年調整)
- 表格式月曆渲染(HTML Table)
- 星期對齊、當前月日期藍色、標題紅色
- 自動獲取當前年月
完整代碼 calendar.php
<?php
/*******************************
* 閏年判斷函數
*******************************/
function leap_year($year) {
return ($year % 4 == 0); // 簡化規則,嚴格應加 100/400 年規則
}
/*******************************
* 初始化月份數據
*******************************/
function setup() {
global $mon_num, $mon_name;
$mon_num = array(31,30,31,30,31,30,31,31,30,31,30,31);
$mon_name = array("一","二","三","四","五","六","七","八","九","十","十一","十二");
global $firstday;
if (leap_year($firstday['year'])) {
$mon_num[1] = 29; // 閏年 2 月 29 天
} else {
$mon_num[1] = 28;
}
}
/*******************************
* 渲染單元格
*******************************/
function showline($content, $color) {
echo "<TD WIDTH=60 HEIGHT=25><FONT COLOR=$color>$content</FONT></TD>";
}
?>
<html>
<head>
<title>社區日歷</title>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
</head>
<body>
<?php
// 獲取當前年月第一天信息
$firstday = getdate(mktime(0,0,0, date("m"), 1, date("Y")));
setup();
// 表頭
echo "<CENTER><TABLE BORDER=2 CELLSPACING=4>";
echo "<TH COLSPAN=7 HEIGHT=50><FONT COLOR=red SIZE=3>";
echo "{$firstday['year']}年 " . $mon_name[$firstday['mon']-1] . "月 月曆";
echo "</FONT></TH>";
// 星期標題
$weekDay = array("日","一","二","三","四","五","六");
echo "<TR ALIGN=center VALIGN=center>";
for ($i = 0; $i < 7; $i++) showline($weekDay[$i], "red");
echo "</TR>";
// 日期填充
$toweek = $firstday['wday']; // 本月 1 號是星期幾 (0-6)
$lastday = $mon_num[$firstday['mon']-1]; // 本月總天數
$day_count = 1;
$up_to_firstday = 1;
$weeks = ceil(($lastday + $toweek) / 7);
for ($row = 0; $row < $weeks; $row++) {
echo "<TR ALIGN=center VALIGN=center>";
for ($col = 1; $col <= 7; $col++) {
if ($up_to_firstday <= $toweek || $day_count > $lastday) {
echo "<TD> </TD>";
$up_to_firstday++;
} else {
showline($day_count, "blue");
$day_count++;
}
}
echo "</TR>";
}
echo "</TABLE></CENTER>";
?>
</body>
</html>
關鍵算法解析
| 變量 | 含義 | 計算 |
$toweek | 月首星期偏移 | getdate()['wday'] (0=周日) |
$lastday | 月總天數 | $mon_num[$mon-1] (閏年已調整) |
$weeks | 需渲染週數 | ceil(($lastday + $toweek)/7) |
$up_to_firstday | 偏移計數器 | 從 1 遞增至 $toweek |
擴展方向
- 加入農曆/節氣顯示
- 支持年月切換導航(GET 參數)
- 事件標記(點擊彈窗編輯)
- 響應式 CSS 適配移動端
- 嚴格閏年算法:
($y%400==0) || ($y%4==0 && $y%100!=0)