Welcome

首页 / 软件开发 / 数据结构与算法 / 算法系列(二十) 计算中国农历(一)

算法系列(二十) 计算中国农历(一)2014-05-24 csdn博客 吹泡泡的小猫世界各国的日历都是以天为最小单位,但是关于年和月的算法却各不相同,大致可以分为三类:

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

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

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

我国古人很早就开始关注天象,定昼夜交替为“日”,月轮盈亏为“月”,寒暑交替为“年” ,在总结日月变化规律的基础上制定了兼有阴历月和阳历年性质的历法,称为中国农历。本文将介绍中国 农历的历法规则、天干地支(Heavenly Stems,Earthly Branches)的计算方法以、二十四节气与中国农 历的关系以及知道节气和日月合朔的精确时间的情况下推算中国农历年历的方法。

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

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

202 void CalculateYearGanZhi(int year, int *gan, int *zhi)

203 {

204     int sc = year - 2000;

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

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

207

208     if(*gan < 0)

209         *gan += 10;

210     if(*zhi < 0)

211         *zhi += 12;

212 }

获得2008年的干支纪年:

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

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

146     int gan,zhi;

147

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

149

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

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

结 果是:农历戊子鼠年。