PHP 世纪万年历:经典农历阳历对照算法与实现

拾光
拾光
发布时间:2026-10-14| 3人浏览过
原创

实现一个支持公历与农历互转的“世纪万年历”,核心在于准确计算阳历总天数并对应至农历数据表。本文将拆解该脚本的数据结构定义、时间基准设定、日期运算逻辑以及前端展示流程。

目标与数据结构准备

世纪万年历旨在通过代码显示指定年份和月份的日历,同时标注对应的农历日期、天干地支及生肖。其实现依赖于几组关键的数据常量:$everymonth 用于存储农历每月的天数及闰月标记;$mten 和 $mtwelve 分别存储天干(甲乙丙…)与地支(子丑寅…含生肖);$mmonth 与 $mday 则负责将数字映射为中文农历年月显示文本。

第1步:定义农历基础数据数组

目的:建立农历时间的静态映射表。 入口:初始化全局变量。 动作:构建 $everymonth 二维数组,索引代表农历年份在序列中的位置,内部数组包含13或14个元素,分别对应各月天数及特殊标记(如是否闰年、闰月序号等)。同时定义天干地支映射数组,确保后续计算结果能直接转化为可读的中文字符串。
重要参数:$everymonth 的结构需严格符合农历置闰规则。
完成状态:所有基础字典数组已赋值,可随时查询任意农历日期的属性。

日期处理与算法逻辑

转换的核心在于找到阳历日期与农历数据的连接点。脚本以1900年12月21日作为起始参考点($total=11),通过累加法计算目标日期距离起点的总天数,进而推算出对应的农历索引。

第2步:计算目标阳历的总天数

目的:确定当前查询日期相对于基准日期的偏移量。
入口:用户输入的 $year 和 $month,默认为当天日期。
动作:首先遍历从1901年到目标年份的前一年,累加每年天数(平年365天,闰年366天)。随后使用 switch 语句累加当年已过月份的天数。若当年为闰年且月份大于2月,额外加1天。最后结合基准日的星期余数,计算出当月1日是星期几。
重要参数:$total 为累计天数,$week 为当月1日星期索引。
完成状态:获得准确的 $total 值和初始星期偏移量。

第3步:推算农历月份与日期

目的:将阳历天数映射回农历具体日期。
入口:$total 和 $everymonth 数组。
动作:采用嵌套循环,外层遍历农历年份索引 $j,内层遍历农历月份 $i,持续累加农历天数 $mtotal。当 $mtotal >= $total 时,说明目标日期落在当前农历月份内,跳出循环。此时,当月1日的农历日期 $md 可通过公式 $everymonth[$j][$i] - ($mtotal - $total) 计算得出。
重要参数:$j 为农历年索引,$i 为农历月索引。
完成状态:确定了目标日期对应的农历月份索引 $i 和当日农历初/廿数值 $md。

页面渲染与交互实现

确定日期数据后,脚本通过 HTML 表格形式输出日历,并处理跨年和闰年显示的边界情况,最后提供表单进行交互式查询。

第4步:生成日历表格与农历标注

目的:可视化展示当月日期及对应的农历信息。
入口:前序步骤计算出的 $week, $dd (当月天数), $md (农历日)。
动作:使用 for 循环创建表格行,内嵌 for 循环填充7列。根据 $k (初始空白格) 决定首行是否需要留白。对于有效日期,判断是周日、周六还是普通工作日以设置字体颜色(红/绿/黑)。在显示日期数字的同时,拼接农历文本:若为初一则显示月份名(含“闰”字处理),否则显示日期名。
重要参数:颜色码 #FF0000 (日), #008000 (六), #000000 (其他)。
完成状态:HTML 表格完整渲染了阳历与农历对照内容。

第5步:实现月份导航与表单查询

目的:允许用户切换查看相邻月份。
入口:当前 $year, $month 及配置文件路径 $file。
动作:计算上月和下月的年月值,注意处理1月的前一月为上年12月,12月的下月为次年1月的逻辑。在表格下方生成指向 $file?year=...&month=... 的链接。同时提供下拉菜单表单,包含1901至2020年的年份选项及1-12月选项,提交后重载当前页面以刷新显示。
重要参数:URL 参数 year 和 month。
完成状态:用户可通过点击链接或提交表单自由浏览历史及未来年份的日历。

关键技术要点总结

该实现方案未依赖外部数据库或复杂的农历计算库,而是通过硬编码的农历月数据表实现了轻量级的万年历功能。其优势在于执行效率高,适合传统 PHP 环境部署。需要注意的是,农历数据通常精确到具体某一年份的置闰规律,因此在扩展年份范围时,需确保 $everymonth 数组数据的持续准确性。此外,闰月和跨年显示的逻辑细节(如标题栏年份跨越的处理)是提升用户体验的关键所在。

以上就是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 算法库。