Skip to content

iw17/nongli

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

农历

zh en

农历是中国的传统历法,依据太阳和月球的预报位置和一定的日期编排规则,由中国科学院紫金山天文台依据国家标准 GB/T 33661-2017 负责编算发行。作为特殊的阴阳合历,农历既能反映季节、农时和物候特征,又能体现月相变化和潮汐大小等自然现象,在日常生活、农业生产、渔业生产、防汛抗洪、航海实践等方面具有广泛的应用价值。

目录

  1. 数据
    1. 配置环境
    2. 爬取原始数据
    3. 重排数据
    4. 生成数据文件
  2. 拟合
    1. 运行测试样例
    2. 日期
    3. 生日
    4. 节气
    5. 时候
    6. 星座
    7. 干支
    8. 伏天
    9. 数九
    10. 八字
      1. 年柱
      2. 月柱
      3. 日柱
      4. 时柱
  3. 说明
  4. 致谢
  5. 附录
    1. 24 节气
    2. 12 星座
    3. 10 天干
    4. 12 地支
    5. 词汇表

数据

本节假设用户的当前工作目录为 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”。
  • 本仓库计算所得八字仅供参考,正所谓“神仙难断子时命”,在临界点附近,微小误差也可能导致排盘不准确。
  • 八字及星座与人的性格、命理等的关系并无科学依据,请相信科学,切勿迷信;本仓库不承担一切不利后果。
  • 有些网站利用人工智能生成代码文档,其中与本仓库有关的内容若存在任何错误或瑕疵,本仓库概不负责。

致谢

  • 感谢许剑伟先生及其开发的“超级万年历”网站。
  • 感谢赵语涵女士提供农历闰月过生日的详细规则。

附录

24 节气

序号 节气 太阳视黄经度数
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

12 星座

序号 星座 节气
0 白羊 春分、清明
1 金牛 谷雨、立夏
2 双子 小满、芒种
3 巨蟹 夏至、小暑
4 狮子 大暑、立秋
5 处女 处暑、白露
6 天秤 秋分、寒露
7 天蝎 霜降、立冬
8 射手 小雪、大雪
9 摩羯 冬至、小寒
10 水瓶 大寒、立春
11 双鱼 雨水、惊蛰

注:上述星座名参照占星学的习惯用法,与天文学上的星座命名可能不一样。处女座、射手座、水瓶座在天文学上分别称为室女座、人马座、宝瓶座。

10 天干

序号 天干 碳原子数
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10

注:本仓库为了编程方便,采用从 0 开始的序号。在有机化学中,10 个天干分别表示 1 到 10 个碳原子,如甲烷 $\rm{CH_4}$、丁烷 $\rm{C_4H_{10}}$

12 地支

序号 地支 生肖
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 开始累计的秒数。

About

C/C++ library for Chinese calendar along with Python spider

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published