农历是中国的传统历法,依据太阳和月球的预报位置和一定的日期编排规则,由中国科学院紫金山天文台依据国家标准 GB/T 33661-2017 负责编算发行。作为特殊的阴阳合历,农历既能反映季节、农时和物候特征,又能体现月相变化和潮汐大小等自然现象,在日常生活、农业生产、渔业生产、防汛抗洪、航海实践等方面具有广泛的应用价值。
本节假设用户的当前工作目录为 nongli/data。若导出到 fit/data.hpp 中 1900 至 2199 年的数据已经足够,则本节可以跳过。GitHub Releases 提供了几个年份区间对应的 data.hpp,若这些区间不能满足需求,可以参考本节内容自行导出。
本节 Python 代码均可在 3.11.2 环境下运行,较新版本的 Python 应该也可以运行。如果不能运行,欢迎指出。
在 venv 中执行如下命令,配置环境:
python -m pip install -r requirements.txt执行如下命令,获取从 1900 年到 2199 年的原始数据并导出到 data/build/raw.txt:
python -u spider.py -l 1900 -u 2199上述命令中的上下界可以按需修改。由于“超级万年历”拟合算法的精度有限,-4712 A.D.(4713 B.C.)以前和 9999 A.D. 以后的计算很可能不准确。
历史上月份序号发生过多次变动,但为方便起见,均用现在的历法排列当时的年份、月份。
执行如下命令,将重排后的朔与节气信息导出到 data/build 目录下:
python -u split.py特别提醒:本仓库不适用于计算和研究历史上三国及以前实际采用的历法。
执行如下命令,将从 1900 年到 2199 年的拟合参数与残差数据导出到 fit/data.hpp:
python -u coefs.py -l 1900 -u 2199 -o ../fit上述命令中的上下界可以按需修改,但不能超过爬虫脚本导出的原始数据范围。
本节假设用户的 C++ 编译器为 Clang、GCC、MSVC 三者之一,且支持 64 位整数类型和 C++17 或更新的标准。从 C++20 开始,语言标准规定有符号整数使用 2-补码表示,且其右移为算术右移。事实上,绝大多数现代编译器都这样实现,因此假设用户的编译器在按照 C++17 标准编译时也是如此。
所有拟合与真太阳时校正均采用整数和定点数运算,避免浮点数运算,以加快计算速度。
本节假设用户的当前工作目录为 nongli/fit。执行如下命令,构建并运行测试样例:
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build . --config Release
ctest -C Release农历月的初一为“朔”(太阳和月球地心视黄经相同的时刻)所在日。包含节气冬至在内的农历月为十一月(冬月)。若从一个冬月到下一个冬月之前有 13 个月,则其中第一个不含中气(冬至、大寒……小雪)的月份为闰月。每个农历年从正月开始,到下一个正月之前为止。本仓库代码中,nian(年)指从一个春节(正月初一)到下一个春节之前的时间。月份编码 ryue 为 2、3……24、25 分别对应正月、闰正月……十二月、闰十二月。农历十一月、十二月也分别称为冬月、腊月。
1970 年对应 Unix 时间戳从 3081600 秒到 33753600 秒之前的时间。
农历生日是指与出生当日的月份和天数都相同的日子。如果出生当日逢三十,在对应月份只有 29 天的年份,在该月廿九过生日。如果出生于闰月,在没有对应闰月的年份,在对应非闰月过生日;在有对应闰月的年份,在对应闰月过生日。
出生于 1987 年正月初一的人,每年正月初一过生日。
出生于 2004 年二月三十的人,2023 年在二月三十过生日,2024 年在二月廿九过生日。
出生于 2004 年闰二月十六的人,2022 年在二月十六过生日,2023 年在闰二月十六过生日。
节气为太阳地心视黄经为 15° 的整数倍的时刻,也指从一个节气时刻到下一个节气时刻之前的时间段。24 节气的名称及对应的太阳视黄经度数见附录。本仓库代码中,sui(岁)指从一个冬至到下一个冬至之前的时间。节气序号为 0、1……23 分别对应冬至、小寒……大雪,其中逢奇数序号为节令,逢偶数序号为中气。
1970 岁对应 Unix 时间戳从 -861379 秒到 30695740 秒之前的时间。
在古汉语中,“时”为季节,“候”为时令。
本仓库代码中,shihou(时候)指由上述“岁”及“节气”组成的结构。
这里的星座主要是占星学上的概念,并非天文学上的术语。星座起源于古巴比伦,不属于农历,但由太阳视黄经确定,即与农历节气对应。星座序号为 0、1……11 分别对应白羊、金牛……双鱼。12 星座的名称及对应的节气见附录。从白羊(春分)开始,每逢中气(春分、谷雨……雨水)进入下一星座。
干支是天干(甲、乙……癸)和地支(子、丑……亥)的合称,两两相配用于循环计数,60 为一周期。10 天干与 12 地支的名称见附录。干支序号为 0、1……59 分别对应甲子、乙丑……癸亥。
从夏至当日起,第三个庚日进入头伏(初伏),第四个庚日进入二伏(中伏);从立秋当日起,第一个庚日进入三伏(末伏)。头伏 10 天,二伏 10 天或 20 天,三伏 10 天,一共 30 天或 40 天。
从冬至当日起,每九天为一个“九”,一共 9 个“九”,81 天。
生辰八字由出生的日期时间决定,年、月、日、时共四柱,每柱干支两字。古代白天以日晷测量的时间(真太阳时)为准,钟表时间(平太阳时)要按照出生地经度校正到地方时,还要利用天文学算法计算其与真太阳时的差距,得到出生的真太阳时。
以立春为分界点,每逢立春进入下一“年”。值得一提的是,生肖(鼠、牛……猪)虽然也与地支对应,但习惯上以春节为分界点。
1984 岁的立春进入甲子年。
以节令为分界点,每逢节令(立春、惊蛰……小寒)进入下一“月”。
2023 岁的大雪进入甲子月。
以地方时真太阳时 0 点(子正)为分界点,每逢 0 点进入下一“日”,但不进入下一“时”。
在东经 120°,Unix 时间戳 1735185600 秒所在日为甲子日。
以地方时真太阳时奇数点整(子初 23 点、丑初 1 点……亥初 21 点)为分界点,每逢奇数点进入下一“时”。
在东经 120°,Unix 时间戳 1738598400 秒所在时辰为甲子时。
- 原始数据来源于超级万年历。
- 本仓库不考虑闰秒,也不考虑 1986 年至 1991 年中国曾在夏季实行的夏时制,即不区分“北京时间”与“UTC+8”。
- 本仓库计算所得八字仅供参考,正所谓“神仙难断子时命”,在临界点附近,微小误差也可能导致排盘不准确。
- 八字及星座与人的性格、命理等的关系并无科学依据,请相信科学,切勿迷信;本仓库不承担一切不利后果。
- 有些网站利用人工智能生成代码文档,其中与本仓库有关的内容若存在任何错误或瑕疵,本仓库概不负责。
- 感谢许剑伟先生及其开发的“超级万年历”网站。
- 感谢赵语涵女士提供农历闰月过生日的详细规则。
| 序号 | 节气 | 太阳视黄经度数 |
|---|---|---|
| 0 | 冬至 | 270 |
| 1 | 小寒 | 285 |
| 2 | 大寒 | 300 |
| 3 | 立春 | 315 |
| 4 | 雨水 | 330 |
| 5 | 惊蛰 | 345 |
| 6 | 春分 | 0 |
| 7 | 清明 | 15 |
| 8 | 谷雨 | 30 |
| 9 | 立夏 | 45 |
| 10 | 小满 | 60 |
| 11 | 芒种 | 75 |
| 12 | 夏至 | 90 |
| 13 | 小暑 | 105 |
| 14 | 大暑 | 120 |
| 15 | 立秋 | 135 |
| 16 | 处暑 | 150 |
| 17 | 白露 | 165 |
| 18 | 秋分 | 180 |
| 19 | 寒露 | 195 |
| 20 | 霜降 | 210 |
| 21 | 立冬 | 225 |
| 22 | 小雪 | 240 |
| 23 | 大雪 | 255 |
| 序号 | 星座 | 节气 |
|---|---|---|
| 0 | 白羊 | 春分、清明 |
| 1 | 金牛 | 谷雨、立夏 |
| 2 | 双子 | 小满、芒种 |
| 3 | 巨蟹 | 夏至、小暑 |
| 4 | 狮子 | 大暑、立秋 |
| 5 | 处女 | 处暑、白露 |
| 6 | 天秤 | 秋分、寒露 |
| 7 | 天蝎 | 霜降、立冬 |
| 8 | 射手 | 小雪、大雪 |
| 9 | 摩羯 | 冬至、小寒 |
| 10 | 水瓶 | 大寒、立春 |
| 11 | 双鱼 | 雨水、惊蛰 |
注:上述星座名参照占星学的习惯用法,与天文学上的星座命名可能不一样。处女座、射手座、水瓶座在天文学上分别称为室女座、人马座、宝瓶座。
| 序号 | 天干 | 碳原子数 |
|---|---|---|
| 0 | 甲 | 1 |
| 1 | 乙 | 2 |
| 2 | 丙 | 3 |
| 3 | 丁 | 4 |
| 4 | 戊 | 5 |
| 5 | 己 | 6 |
| 6 | 庚 | 7 |
| 7 | 辛 | 8 |
| 8 | 壬 | 9 |
| 9 | 癸 | 10 |
注:本仓库为了编程方便,采用从 0 开始的序号。在有机化学中,10 个天干分别表示 1 到 10 个碳原子,如甲烷
| 序号 | 地支 | 生肖 |
|---|---|---|
| 0 | 子 | 鼠 |
| 1 | 丑 | 牛 |
| 2 | 寅 | 虎 |
| 3 | 卯 | 兔 |
| 4 | 辰 | 龙 |
| 5 | 巳 | 蛇 |
| 6 | 午 | 马 |
| 7 | 未 | 羊 |
| 8 | 申 | 猴 |
| 9 | 酉 | 鸡 |
| 10 | 戌 | 狗 |
| 11 | 亥 | 猪 |
cjie:从 1970 岁冬至(落在公历 1969 年)开始累计的节气数。cyue:从农历 1970 年正月开始累计的月份数。date:公历日期(公历年、公历月、日)。dati:公历日期时间(公历年、公历月、日、小时、分、秒、时区)。nian:农历年,从春节(正月初一)到下一个春节之前的时间。nyue:从当年正月开始累计的月数,包含闰月。riqi:农历日期(农历年、农历月、日)ryue:带闰月的月份编码;最低位 1 为闰月,其余位为月份。shihou:时候(岁、节气)。sui:岁,从冬至到下一个冬至之前的时间。uday:从公历 1970-01-01 开始累计的天数。usec:从公历 1970-01-01 00:00:00 UTC 开始累计的秒数。