PHP实现简单日历:年月导航与高亮今日

阿麦
阿麦
发布时间:2026-10-13| 3人浏览过
原创

本文介绍如何使用原生 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)."&amp;month=".$month."><<</a>年<a href=", $currentUrl, "?year=".($year+1)."&amp;month=".$month.">>></a>";
// 输出当月信息
echo $year . "年" . $month . "月";
// 输出月份切换链接:<< 表示上月,>> 表示下月
echo "<a href=", $currentUrl, "?month=".($month-1)."&amp;year=".$year."><<</a>月<a href=", $currentUrl, "?month=".($month+1)."&amp;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 表格中。

动作:

  1. 计算起始偏移量:使用 mktime(0,0,0,$month,1,$year) 获取当月1号的 Unix 时间戳,再用 date("w") 获取其星期值(0-6)。这个数值决定了表格第一行需要多少个空白单元格。
  2. 填充首日前期的空白:循环输出空白的 <td> 标签。
  3. 输出具体日期:从1号到当月最后一天(使用 date("t") 获取月天数),逐日输出对应的日期数字,并应用前文定义的样式函数。
  4. 换行控制:当某一天是星期六(weekday==6)时,在表格中插入 </tr> 以开始新的一周。

渲染效果如下图所示:

完成判断

访问该脚本,页面应正确显示指定年月的日历网格。点击“<<”、“>>”或“上月/下月”链接后,URL 参数更新且日历内容随之刷新。当前系统日期应以蓝色背景突出显示,星期日的日期显示为红色字体。

简要总结

该方案展示了如何利用 PHP 标准库函数进行纯前端逻辑的日历布局。虽然现代开发中更倾向于使用成熟的 UI 组件库或 JavaScript 框架来处理复杂的日期交互,但此基础实现对于理解 mktime 的时间戳转换原理以及数组/循环在表格渲染中的应用依然具有参考价值。 以上就是PHP实现简单日历的详细内容,更多关于PHP日历开发的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。