算法系列之二十:计算中国农历(一)

算法系列之二十:计算中国农历(一)

原创吹泡泡的小猫最后发布于2013-07-0100:18:50阅读数65351收藏

展开

世界各国的日历都是以天为最小单位,但是关于年和月的算法却各不相同,大致可以分为三类:

阳历--以天文年作为日历的主要周期,例如:中国公历(格里历)

阴历--以天文月作为日历的主要周期,例如:伊斯兰历

阴阳历--以天文年和天文月作为日历的主要周期,例如:中国农历

在介绍中国农历的历法之前,必须要先介绍一下中国古代的纪年方法。中国古代用天干地支纪年,严格来讲,天干地支纪年以及十二属相并不是中国农历历法的一部分,但是在中国历史上直到今天,天干地支以及十二属相一直都是做为中国农历纪年关系密切的一部分而存在,因此这里先介绍一下天干地支纪年法以及十二属相。

中国古代纪年不用数字,而是采用天干地支组合。天干有十个,分别是:甲、乙、丙、丁、戊、己、庚、辛、壬、癸;地支有十二个,分别是:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。使用时天干地支各取一字,天干在前,地支在后,组合成干支,例如甲子、乙丑、丙寅等等,依次轮回可形成六十种组合,以这些天干地支组合纪年,每六十年一个轮回,称为一个甲子。实际上中国古代纪月、纪日以及纪时辰都采用干支方法,这些干支组合起来就是我们熟悉的生辰八字。十二属相又称“十二生肖”,由十一种源自自然界的动物:鼠、牛、虎、兔、蛇、马、羊、猴、鸡、狗、猪以及传说中的龙组成,用于纪年时,按顺序和十二地支组合成子鼠、丑牛、寅虎、卯兔、辰龙、巳蛇、午马、未羊、申猴、酉鸡、戌狗和亥猪。天干地支以及十二生肖常组合起来描述农历年,比如公历2011年就是农历辛卯兔年、2012年是壬辰龙年等等。

计算某一年的天干地支,有很多经验公式,如果知道某一年的天干地支,也可以直接推算其它年份的天干地支。举个例子,如果知道2000年是庚辰龙年,则2012年的干支可以这样推算:(2012-2000)%10=2,2012年的天干就是从庚开始向后推2个天干,即壬;2012年的地支可以这样推算:(2012-2000)%12=0,2012年的地支仍然是辰,因此2012年的天干地支就是壬辰,十二生肖龙年。对于2000年以前的年份,计算出年份差后只要将天干和地支向前推算即可。例如1995年的干支可以这样计算:(2000–1995)%10=5,(2000–1995)%12=5,庚向前推算5即是乙,辰向前推算5即是亥,因此1995年的干支就是乙亥,十二生肖猪年。这个干支推算算法的实现如下:

202voidCalculateYearGanZhi(intyear,int*gan,int*zhi)

203{

204intsc=year-2000;

205*gan=(7+sc)%10;

206*zhi=(5+sc)%12;

207

208if(*gan<0)

209*gan+=10;

210if(*zhi<0)

211*zhi+=12;

212}

获得2008年的干支纪年:

9TCHAR*nameOfTianGan[COUNTS_FOR_TIANGAN]={_T("甲"),_T("乙"),_T("丙"),_T("丁"),_T("戊"),_T("己"),_T("庚"),_T("辛"),_T("壬"),_T("癸")};

10TCHAR*nameOfDiZhi[COUNTS_FOR_DIZHI]={_T("子"),_T("丑"),_T("寅"),_T("卯"),_T("辰"),_T("巳"),_T("午"),_T("未"),_T("申"),_T("酉"),_T("戌"),_T("亥")};

146intgan,zhi;

147

148CalculateYearGanZhi(2008,&gan,&zhi);

149

150text.Format(_T("农历【%s%s】%s年"),

151year,m_curMonth,nameOfTianGan[gan-1],nameOfDiZhi[zhi-1],nameOfShuXiang[zhi-1]);

结果是:农历戊子鼠年。

中国农历是以月亮运行周期为基础,结合太阳运行规律(二十四节气)制定的历法,农历月的定义规则就是中国农历历法的关键,因此要了解中国农历的历法规则,就必须知道如何定义月,如何设置闰月?中国农历的一年有十二个月或十三个月,但是正统的叫法只有十二个月,分别是正月、二月、三月、四月、五月、六月、七月、八月、九月、十月、冬月和腊月(注意,正统的中国农历是没有十一月和十二月的,如果你用的历法软件有显示农历十一月和农历十二月,就说明非常不专业)。中国民间常用“十冬腊月天”来形容寒冷的天气,其实指的就是十月,十一月和十二月这三个最冷的月份。一年有十三个月的情况是因为有闰月,多出来的这个闰月没有月名,只是跟在某个月后面,称为闰某月。比如公历2009年对应的农历乙丑年,就是闰五月,于是这一年可以过两个端午节。

中国农历为什么会有闰月?其实中国农历置闰月是为了协调回归年和农历年的矛盾。前面提到过,中国农历是一种阴阳历,农历的月分大月和小月,大月一个月是30天,小月一个月是29天。中国农历把日月合朔(太阳和月亮的黄经相同,但是月亮不可见)的日期定位月首,也就是“初一”,把月圆的时候定为望日,也就是“十五”,月亮绕地球公转一周称为一个朔望月。天文学的朔望月长度是29.5306日,中国农历以朔望月为基础,严格保证每个月的头一天是朔日,这就使得每个月是大月还是小月的安排不能固定,通常需要通过天文学观测和计算来确定。一个农历年由12个朔望月组成,这样一个农历年的长度就是29.530612=354.3672日,而阳历的一个天文学回归年是365.2422日,这样一个农历年就比一个回归年少10.88天,这个误差如果累计起来过16年就会出现“六月飞雪”的奇观了。为了协调农历年和回归年之间的矛盾,聪明的先人在天文观测的基础上,找到了“闰月”的方法,通过在适当的月份插入闰月来保证每个农历年的正月到三月是春季,四月到六月是夏季,七月到九月是秋季,十月到十二月是冬季,也就是说,让历法和天文气象能够基本对上,不至于出现“六月飞雪”。

m365.2422=n29.5306

这样m和n的比例就是29.5306:365.242219:235,按照这个最接近的整数倍数关系,每19个回归年需要添加的闰月就是:

235–1219=7

也就是“十九年七闰”的由来。但是需要注意的是,“十九年七闰”也并不是精确的结果,每19年就会有0.0892天的误差:

19365.2422-23529.53060.0892

现在,我们知道农历通过置闰月的方式协调农历年和回归年长度不相等的问题,也知道了置闰的方法是“中气置闰”法,那么到底什么是“中气”,又是如何定中气置闰月呢?要回答这个问题,就需要介绍另一个天文现象――节气。二十四节气起源于黄河流域,远在春秋时代,就定出仲春、仲夏、仲秋和仲冬等四个节气。以后不断地改进与完善,到秦汉年间,二十四节气已完全确立,汉武帝太初元年(公元前104年)制定的《太初历》,则第一次从历法上明确了二十四节气的天文位置。

春雨惊春清谷天,

夏满芒夏暑相连,

秋处露秋寒霜降,

冬雪雪冬小大寒,

每月两节不变更,

最多相差一两天。

由于节气在回归年中是均匀分布的,因此公历中的节气日期基本上是固定的,比如立春是在公历的2月3-5日,不会超出这个日期范围,这也就是《二十四节气歌》所说的:每月两节不变更,最多相差一两天。但是在中国农历中哪个中气属于哪个月是有规定的,雨水是正月的中气,春分是二月的中气,谷雨是三月的中气,小满是四月的中气,夏至是五月的中气,大暑是六月的中气,处暑是七月的中气,秋分是八月的中气,霜降是九月的中气,小月是十月的中气,冬至是十一月的中气,大寒是十二月的中气。

在了解了农历与节气的关系以及农历如何置闰月的方法之后,还需要解决一个问题才能着手农历年历的推算,那就是如何确定农历年的开始,或者说哪个月的初一是农历新年的开始?要回答这个问题,就需要了解中国农历特有的“月建”问题。

了解了“月建”问题,就解决了农历朔望月与公历月的对应关系,那就是冬至节气所在的朔望月就是农历的子月,对于目前适用的夏历建寅的月建体系,就意味着冬至节气所在的朔望月是农历的十一月,只要找到这个朔望月的起始日(日月合朔发生的时刻所在的那一日),就找到了公历的日期月农历日期的对应关系。下面总结一下中国农历历法的基本法则:

2、月以中气得名,冬至节气总是出现在农历十一月,包含雨水中气的月为正月(即寅月),月无中气者为闰月,与前一个月同名;

4、农历年以正月初一为岁首(关于农历岁首的说法,请参考文末附加的《小知识5:正月初一和立春节气》),以腊月(十二月)廿九或三十为除夕;

5、如果节气和日月合朔在同一天,则该节气是这个新朔望月的节气。(民间历法)

规则5对节气和朔日在同一天的处理,采用了民间历法的处理原则,关于民间历法和历理历法的区别,请参考文末附加的《小知识1:民间历法和历理历法》。

节气名

小寒

1271448.00

0.00

大寒

1272494.40

立春

1275526.20

2548020.60

雨水

1282123.20

3830143.80

惊蛰

1290082.80

5120226.60

春分

1300639.20

6420865.80

清明

1311153.00

7732018.80

谷雨

1323253.80

9055272.60

立夏

1333685.40

10388958.00

小满

1344107.40

11733065.40

芒种

1351227.00

13084292.40

夏至

1357299.60

14441592.00

小暑

1358968.80

15800560.80

大暑

1358786.40

17159347.20

立秋

1354419.00

18513766.20

处暑

1348236.00

19862002.20

白露

1339003.20

21201005.40

秋分

1328654.40

22529659.80

寒露

1317185.40

23846845.20

霜降

1305760.80

25152606.00

立冬

1295081.40

26447687.40

小雪

1285764.00

27733451.40

大雪

1278469.80

29011921.20

冬至

1273556.40

30285477.60

已知1900年小寒时刻为1月6日2:05:00,以这个节气时刻为基准,推算其它年份节气的算法实现如下:

8staticdoubles_stAccInfo[]=

9{

100.00,1272494.40,2548020.60,3830143.80,5120226.60,6420865.80,

117732018.80,9055272.60,10388958.00,11733065.40,13084292.40,14441592.00,

1215800560.80,17159347.20,18513766.20,19862002.20,21201005.40,22529659.80,

1323846845.20,25152606.00,26447687.40,27733451.40,29011921.20,30285477.60

14};

15

16//已知1900年小寒时刻为1月6日02:05:00

17constdoublebase1900_SlightColdJD=2415025.5868055555;

18

19doubleCalculateSolarTermsByExp(intyear,intst)

20{

21if((st<0)||(st>24))

22return0.0;

23

24doublestJd=365.24219878*(year-1900)+s_stAccInfo[st]/86400.0;

THE END
1.万年历查询日历查询农历查询农历日历老黄历万年历表中华万年历 本机时间2024-12-0223:59:26 2024-12-0215:59:26 格林威治标准时间https://qq.ip138.com/day/
2.儒略日数和日干支计算器时间(24小时制)夜半正午其他时间 时分秒 ,执行公历日期→儒略日数和日干支。 儒略日数: ,执行儒略日数→公历日期和日干支。 计算结果 公历日期: 公元2024年11月29日, 时间: 12:00:00 儒略日数:2460644, 星期五 日干支: 丁酉(干支数=34) 说明https://www.chengxua.com/lishi/Julian_simp.html
3.中国农历年份,rpa,机器人,自动化至此千百年来,中国传统历——汉历(农历)所采用得干支纪年方法,与皇帝年号纪年一样以新年正月朔(元旦)为开始。 从元明清三代的史书,可见干支纪年在正月初一更替的记录:更多内容请查看https://baike.baidu.com/item/%E5%B9%B2%E6%94%AF%E7%BA%AA%E5%B9%B4/3383226 https://wdlinux.cn/html/zonghe/20241128/20015.html
4.技术分析农历日期公式详解:如何准确计算农历日期与节气转换先战胜自己,再战胜庄家。https://www.55188.com/thread-27907839-1-1.html
5.最新版清宫表怎么算怀孕月份?按农历还是阳历?清宫表采取的都是农历的计算方法,怀孕月份以农历月份为准,按受孕当天算,而清宫表怀孕月份就是按末次月经来潮的时间计算。清宫表上面的年龄是按虚龄算,就是出生年月+9个月的农历,虚岁的年龄和怀孕的月份交叉的地方对应的就是孩子的性别了。目前,2023年的清宫表也已经出来了,大家可以对照来看看。但其实清宫表生男https://m.shiguan.myzx.cn/5768.html
6.闰年怀孕算生男生女真的很简单,关键是要找准计算公式闰年怀孕可以通过公式算出生男生女,可根据闰年生男生女表计算。这个表格来源于古代,是根据女性虚岁年龄和受孕农历月份推算出所怀胎儿的性别的一种工具。这个表横向的1-12是代表女性怀孕月份,用农历计算。纵向的19-41代表孕妇的年龄,以虚龄计算。 现在生孩子只有最终生产的时候才能得知孩子的性别,医生通常是不会提前告https://www.quyunbao.com/beiyun/17f9d6a30700007396da.html
7.国历和农历怎么转换没有固定的公式。只要相互比对就可换算出来。我认为:农历和公历因其所依赖计算的自然物不同,所以,就出现了差异。农历是主要按照月亮一周的时间来计算一月的,大约每月29天半多点。每年354天。但是,农历有照顾了地球绕太阳。 1、公历农历转换 将回历换算为公历的算式移项,整理,即可得到公历换算为国历的算式 (公历纪年https://www.105188.com/sh/618011.html
8.农历计算器首页>>时间工具箱>> 农历计算器 计算两个农历日期之间差多少天 农历:年月日 距 农历:年月日 相差:天 推算几天后的农历日期 年月日 (默认今天农历) 往后天 (输入负数向前计算) 结果: →农历转换阳历 →天数计算器https://www.qianask.com/tooltime/nongli.html
9.农历计算方法农历计算方法 计算示例:https://blog.csdn.net/weixin_42763614/article/details/103051262 一、定气定朔 农历是一种阴阳合历,故而计算农历既需计算阴历使用的合朔,也要计算阳历使用的节气。农历最早使用平气和平朔,但平朔常有一日误差,以日食校验多不合。所以经历法发展改用定朔法。平气也有误差,但难以简单观察https://www.jianshu.com/p/d3b63ee7492f
10.问下阴历生日怎么算这是文化差异带来的显著特征之一。中国人过生日的时候时间也是不同的。一般南方人都按照出生那天的公历计算,北方人都按农历计算,也有公历农历都算做生日的。 本网站引用、摘录或转载上述内容仅供网站访问者交流或参考,文中观点或信息与爱问公司无关,与之相关的任何事务以及法律责任均与爱问公司无关。 举报 https://m.iask.sina.com.cn/jxwd/6eL3lgVRqCl.html
11.java知道日期计算农历mob64ca12f062df的技术博客Java 知道日期计算农历 介绍 农历是中国传统的日历系统,它以农业为基础,根据太阳和月亮的运行周期来计算日期。与阳历不同,农历的月份和日期是根据阴阳历表来确定的,所以每年农历的日期是变化的。在 Java 中,我们可以使用一些方法来计算给定日期的农历日期。 https://blog.51cto.com/u_16213431/8928302
12.阴历是怎么算的闰月加在某月之后叫“闰某月”,如刚刚过去的2009年农历闰月为己丑年闰五月(2009年6月23日——2009年7月21日)、即将来临的农历闰月为2012年的壬辰年闰四月(2012年5月21日——2012年6月19日)等。农历的算法是怎么算的? 5分一、农历规则计算: 节气和朔望的时间计算以东经120度,中国标准时间为准。https://www.360doc.cn/article/34990242_963225586.html
13.阴历生日怎么算如何算阴历生日高中知识3、要计算农历生日,需按照出生时的农历,每年在此农历时间便是生日。 4、例如:出生时间是1993年5月31日,对应农历时间是四月十一。如果按照阳历过生日,在每年的阳历5月31日过生日。如果按照农历过生日,在每年的农历四月十一过生日。 以上就是高考网小编为大家介绍的关于阴历生日怎么算 如何算阴历生日问题,想要了解的https://www.027art.com/gaokao/HTML/12972971.html
14.农历预产期怎么算一般按照公式计算,公式是,末次月经的月份加9或者减3,日数加7,如果是农历,一般需要日数加15,就https://mip.yilianmeiti.com/question/2976674.html
15.农历换算工业计算 建筑工程 材料计算 机械计算 环评计算 地理测算 最近计算 资讯列表 智问 诗词查询 国学经典 文案短句 关于我们会员中心 网站首页 > 农历换算农历换算数学思维计算器 微信扫码免费使用更智能的计算器 几天囊计算方法详解 几天囊是计算农历与公历日期差距的传统方法,本文详细介绍了几天囊的计算步骤和注意https://www.zaixianjisuan.com/tag/222702
16.百年农历的计算与速查.docx百年农历的计算与速查.docx 关闭预览 想预览更多内容,点击免费在线预览全文 免费在线预览全文 [公元 1899 年 农历] 大月(30 天):1 月 3 月 5 月 7 月 8 月 10 月 12 月小月(29 天):2 月 4 月 6 月 9 月 11 月 农历春节的公历日期: 2 月 10 日 [公元 1900 年 农历] 大月(30 天):2 https://max.book118.com/html/2023/0527/8052016110005072.shtm
17.公历农历的计算公历是阳历 https://wenwen.soso.com/z/q119106298.htm
18.2024年无春年是指农历还是阳历一般指农历。 所谓“无春年”不是说没有春天,而是说在整个农历中没有立春节气的年份称之为无春年,这是因为农历和公历计算方式不同,地球公转周期公历一年是365天,若是按农历计算却只有354天,之间相差十来天。 逐年积累,公历和农历之间的差距越来越大,古人为了弥补这个现//www.ganhuo11.com象,采用了19年7闰法,http://www.guocangtianxia.com/news/6523.html
19.农历生日怎么算?农历生日和阳历生日差多少天?农历生日计算出来的一般是虚岁。它是以春节(农历新年)分界点的,具体换算方法是: ①:虚岁换算成周岁:在本人阳历生日到来之前,周岁=虚岁-2;在本人阳历生日到来及以后,周岁=虚岁-1;周岁换算成虚岁:在本人阳历生日到来之前,虚岁=周岁+2;在本人阳历生日到来及以后,虚岁=周岁+1。 https://m.k366.com/minsu/nongli/129360.html
20.由阳历计算农历的类(C++)包含24节气,国内外重要节日这个名为“由阳历计算农历的类(C++)包含24节气,国内外重要节日”的项目,显然旨在创建一个功能丰富的类,能够将公历日期转换为农历日期,并且能够识别并处理重要的节日和24节气。下面我们将详细讨论相关的知识点。 农历是一种基于月相的历法,与公历(阳历)基于太阳回归年的周期不同。在C++中实现农历转换需要理解农历的https://download.csdn.net/download/feng_0922/1150208
21.清宫表的怀孕月份怎么算怀孕清宫表怀孕月份一般根据末次月经来潮的第1天开始计算的。清宫表是古代留下来的推算孕妇生男还是生女孩的一种传统的方法,虽然比不上现代医学的准确,但也流传许久,不少孕妇都会想要通过看清宫表来知道自己肚子里怀的是男孩子还是女孩子。 首先,需要确认母亲的农历年龄。农历年龄是指在出生年份的基础上,每年增加一岁,https://tag.120ask.com/jibing/huaiyun/1063606.html