PHP实现简单日历:年月导航与高亮今日
本文介绍如何使用原生 PHP 编写一个简单的网页日历。该程序无需数据库支持,通过 URL 参数切换年月,利用内置日期函数自动计算每月天数、初始星期偏移量,并实现当月日期高亮及周末样式区分。
结果与目标
最终目标是生成一个可交互的 HTML 表格日历。主要功能包括:
- 年月导航:通过点击链接调整显示的年份(上一年/下一年)或月份(上月/下月)。
- 日期定位:自动识别当月1号是星期几,并在表格中预留空白单元格,使后续日期准确对齐。
- 视觉反馈:将星期日文字标红,将当前系统日期所在单元格添加蓝色背景以示区分。
准备条件
该脚本仅依赖 PHP 内置的日期处理函数(date(), mktime()),无需额外安装扩展。只需在一个支持 PHP 解析的环境中运行即可。
真实操作顺序
第1步:接收输入与初始化参数
目的:确定要显示的日历是哪一年哪一月。
动作:检查 URL 中的 year 和 month 参数。若未提供,则默认使用当前服务器的系统时间。为防止非法输入导致错误,对年份设定下限(1971年之前视为出错)。
<?php
header("Content-type: text/html;charset=utf-8");
// 获取年份,默认当前年份
$year = (!isset($_GET['year']) || $_GET['year'] == "") ? date("Y") : $_GET['year'];
// 获取月份,默认当前月份
$month = (!isset($_GET['month']) || $_GET['month'] == "") ? date("n") : $_GET['month'];
$currentUrl = $_SERVER['PHP_SELF']; // 获取当前页面URL用于构建跳转链接
if ($year < 1971) {
echo "出错!";
exit();
}
?>
第2步:边界处理与导航链接构建
目的:确保月份在1-12之间循环,并生成切换年月的超链接。
动作:如果用户请求的月份小于1,则将月份重置为12,年份减1;若大于12,则重置为1,年份加1。随后输出上一月/下一月和上一年/下一年的链接。
<?php
// 处理月份溢出逻辑
if ($month < 1) {
$month = 12;
$year -= 1;
}
if ($month > 12) {
$month = 1;
$year += 1;
}
// 输出年份切换链接:<< 表示上一年,>> 表示下一年
echo "<a href=", $currentUrl, "?year=".($year-1)."&month=".$month."><<</a>年<a href=", $currentUrl, "?year=".($year+1)."&month=".$month.">>></a>";
// 输出当月信息
echo $year . "年" . $month . "月";
// 输出月份切换链接:<< 表示上月,>> 表示下月
echo "<a href=", $currentUrl, "?month=".($month-1)."&year=".$year."><<</a>月<a href=", $currentUrl, "?month=".($month+1)."&year=".$year.">>></a>";
?>
第3步:定义辅助样式函数
目的:封装日期显示的样式逻辑,如颜色和高亮状态。
动作:
font_color():判断某天是否为星期日(星期索引为0),若是则返回红色样式类/属性。bgcolor():对比当前显示的日期与系统今日日期,若一致则添加蓝色背景标识。font_style():根据需求设置文本粗细等样式(本例中对 Sunday 加粗)。
<?php
// 获取系统今天的日期号数作为基准
$bgtoday = date("d");
function font_color($m, $d, $y) {
if (date("w", mktime(0,0,0,$m,$d,$y)) == 0) { // 0代表星期日
return "red";
}
return "black";
}
function bgcolor($m, $sysDay, $checkDay, $y) {
// 比较当前遍历到的日期与系统今日日期是否相同
if (date("d", mktime(0,0,0,$m,$checkDay,$y)) == date("d", mktime(0,0,0,$m,$sysDay,$y))) {
return "bgcolor=#6699FF"; // 高亮背景色
}
return "";
}
?>
第4步:渲染日历表格结构
目的:将计算出的数据填入 HTML 表格中。
动作:
- 计算起始偏移量:使用
mktime(0,0,0,$month,1,$year)获取当月1号的 Unix 时间戳,再用date("w")获取其星期值(0-6)。这个数值决定了表格第一行需要多少个空白单元格。 - 填充首日前期的空白:循环输出空白的
<td>标签。 - 输出具体日期:从1号到当月最后一天(使用
date("t")获取月天数),逐日输出对应的日期数字,并应用前文定义的样式函数。 - 换行控制:当某一天是星期六(weekday==6)时,在表格中插入
</tr>以开始新的一周。
渲染效果如下图所示:
完成判断
访问该脚本,页面应正确显示指定年月的日历网格。点击“<<”、“>>”或“上月/下月”链接后,URL 参数更新且日历内容随之刷新。当前系统日期应以蓝色背景突出显示,星期日的日期显示为红色字体。
简要总结
该方案展示了如何利用 PHP 标准库函数进行纯前端逻辑的日历布局。虽然现代开发中更倾向于使用成熟的 UI 组件库或 JavaScript 框架来处理复杂的日期交互,但此基础实现对于理解 mktime 的时间戳转换原理以及数组/循环在表格渲染中的应用依然具有参考价值。
以上就是PHP实现简单日历的详细内容,更多关于PHP日历开发的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













