时刻如风,算法体系之七十

2020-04-04 19:29 来源:未知

辉煌灿烂的中华文化,在其五千年的发展历程中,为世界贡献了一批具有原创性的重大发明创造,彰显了中华民族的聪明才智。"四大发明"是我们的骄傲,而在"四大发明"之外,又有哪些发明创造呢?

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

 www.bwin8.com 1

干支

 

 二十四节气是我国古代历法的独特创造。世界文明古国,在天文学上都曾取得相当高的成就,但是仅有中国除认识到太阳周年视运动到达的4个特殊点:春分、夏至、秋分和冬至之外,还确定了其他20个节气。历史上,随着中外文化的交流,二十四节气还相继流传到了日本、朝鲜和一些东南亚国家,在这些国家中也产生了很积极的作用。

干支是中国古代重要的符号系统,主要用于纪时,也用于表示方位。

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

  时间如风,星移斗转。几千年来,历法中节气的设置不仅对我国农牧业的发展起了重要作用,同时围绕节气也产生了许多民间节日和民俗活动,体现了我国博大精深的传统文化。

干支是甲、乙、丙、丁、戊、己、庚、辛、壬、癸十个天干和子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥十二个地支的合称。十天干与十二地支循环组合成为六十干支。

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

  我国的传统历法是阴阳历,即把阴历和阳历相结合形成的一种历法。单纯的阴历以反映月亮盈亏变化周期的朔望月为时间长度的基准。一朔望月的平均长度为29.53059日。阴历中历月分为大月和小月两种,大月30日,小月29日,一历年12个月的长度大约为354日至355日。然而,如纯粹使用阴历则将与四季变迁的步调不匹配,因为四季变化的周期是一回归年,它等于365.24219日。为了克服这一缺陷,古人想出了置闰的办法,即通过在若干年内加入一个闰月,使这一年(闰年)的历年长度增加为383日至385日,于是在若干年内的历年平均长度就接近于一个回归年。因此,现在每年农历的正月初一只是在公历的1月下旬和2月的上、中旬之间来回移动。古今中外普遍使用的方法是在19年中加7个闰月。我国最迟在战国时期就已确定了这样的置闰法则。

殷墟甲骨文表明,至迟从公元前13世纪的商代后期开始,干支已普遍用于纪日,有一块牛胛骨完整地记录了六十干支。

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

  设置闰月使阴历与阳历结合起来了。也就是说,阴阳历中加入闰月是阳的成分。甲骨文显示,我国至迟在殷商时代就采用了这个方法,一直延续到今天的农历。可是即便这样,由于具体的历年长度毕竟与回归年不符,因而历法上的月和日与农业生产的节令无法形成确切的对应关系。为了克服这个问题,中国古代独创了二十四节气。可以说,二十四节气是我国传统历法中又一种阳的成分。

干支纪日法从商代后期一直连续使用到今天,历代的历谱都注明干支。由于干支纪日法的连续使用,使我们能够更准确地确定古代历法中的日期具体所指为现行公历中的哪一天。

 

  我们知道,地球自转一周是1日;地球围绕太阳公转一周是1年,24个节气就是表示地球运动在公转轨道上24个不同的位置。一个节气,首先是指地球在绕太阳的轨道上到达这一位置的瞬间;其次,它又指包含这个瞬间的一日。所以,二十四节气与公历的日期有基本固定的对应性。

以十二地支纪月至迟出现在春秋时代,以冬至所在之月为子月,顺序排列,这种配置方式到现在一直未变。天干和地支结合起来纪月出现较晚。

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

  二十四节气是我国传统历法的重要组成部分。在西汉初年淮南王刘安偕其门人编撰的《淮南子天文训》(公元前140年左右)中,有完整的二十四节气记载,其名称和顺序都同现今通行的基本一致。二十四节气的名称是根据地球在公转轨道上位置所反映的寒暑变化并结合相应的气象条件和自然现象(即物候)来命名的。其中春分、夏至、秋分、冬至,是季节的转折点。在北半球,一年之内,春、秋分日昼夜等长,夏至日白昼最长,而冬至日则白昼最短。

以十二地支纪年应该是由岁星(木星)纪岁发展而来。战国到秦代使用一套很奇怪的60循环的名称纪岁,如阏逢摄提格岁。到汉武帝时代始用干支替换了这套奇怪的年名,之后一直延续下来。

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

  古人不知道地球环绕太阳运行,但是他们早就察觉了太阳在天空中相对于不动的恒星背景在移动,并定出了太阳在天空移动的轨道,把它称为黄道。在某一节气,太阳到达黄道上的一个确定的点。所以节气的安排取决于太阳在黄道上的位置。我国古代创造了一种独特的天体位置计量体系。古人把天赤道与黄道之间的恒星组合成二十八宿,每一宿中确定一颗星,称为距星。它们本身的坐标经过精密的测定,被作为计量其他天体坐标的基准。只要确定了某一天体(例如太阳)与一个距星在赤道上或黄道上的相对距离(称为赤道宿度或黄道宿度),就能确定这个天体的位置。我国最迟在战国时期就已经出现了一年12个月太阳所在赤道宿度的完整记述。

十二地支也用于表示一日之中的时辰。把一天的时间划分为12个时辰,子夜称为子时,相当于现在24小时制的半夜23时至凌晨1时,依次向后排列,这种方法最迟在汉初已经出现,配上天干则是到了唐代。

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

  最初的二十四节气是把一回归年的日数等分成24份,例如在汉代人们认定冬至在赤道斗宿21度,我国古代把全天分成365度,自此每经一节气加一个平均值365/24=15度,即为各节气太阳所在的赤道宿度值。这相当于从冬至以后每隔15.218日,为一个新的节气。这种平均安排节气的方法称为平气。后世对于冬至的赤道宿度通过实测不断有所改正,但一旦冬至的赤道宿度确定,以后的各节气便由平均值累加而定。这种方式直到清代才有所改变。

天干和地支也用于表示方位。中国古代地平方位的划分一般是分为四方、八方、十二方位,在四方系统的划分中常用子、午、卯、酉来表示北南东西,在十二方位的系统中则是使用十二地支来表示方位,以正北方向为子,顺时针依次为丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。

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

  西汉汉武帝元封七年(公元前104年)颁布了新制定的《太初历》,并宣布这一年为太初元年。首次把二十四节气完整地引进历法。《太初历》用的是平气法:从冬至开始,等间隔地依次相间安排各个节气;每月有一个节气,一个中气,如立春为正月节气,雨水为正月中气。由于两个节气之间的时间大于一个朔望月的时间,所以可能出现一个月内只有一个节气或一个中气的情况。因而《太初历》规定节气可以在上月的下半月或本月的上半月出现,而中气一定要在本月出现。如果遇到没有中气的月份,则定为上月的闰月。于是,从闰月以后的这月开始,将一直保持每月有一个节气、一个中气,直到两年多以后再一次置闰。这种置闰原则一直沿用至今。

此外,干支也被配上阴阳五行的属性,在中国古代阴阳五行化的时空构架中扮演重要角色。

  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 }

  北齐张子信经20余年的精心观测与潜心研究,在公元570年前后发现了太阳在天空中周年视运动的不均匀现象。地球在冬至后不久过近日点,在夏至后不久过远日点。过近日点时运行速度最快,在冬至前后两个节气间的日期差要短于平均值,只有14天多,之后逐渐减慢;直至到达远日点运行速度最慢,夏至前后两个节气间的日期差近16天,之后逐渐加快,所以他发现了各个节气之间的时间间隔是不等长的。

阴阳合历

获得2008年的干支纪年:

  隋仁寿四年(公元604年),刘焯在他编制的《皇极历》中根据这种不均匀现象对二十四节气的推算提出改革。他把太阳运动的轨道黄道等分成24份,太阳移行到每一等分点时就是每一节气的时刻,此法称为定气。他把太阳的运动看做等加速、等减速运动,用时间的二次函数拟合太阳运动。刘焯创立了二次差内插算法,并用这种算法计算太阳位置和定气时刻。

历法的主要功能之一是安排历日。世界上不同文明创造了多种多样的历法,其中有的是纯阴历,根据朔望月安排历日;有的是纯阳历,依据太阳的回归年;还有其他形式的历法。中国古代历法为阴阳合历,即把朔望月和基于太阳年而划分的节气结合起来考虑历日安排。

    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]);

  元朝初年,郭守敬和王恂等人编制了《授时历》。他们认为前人对于太阳运动的认识比较粗疏,太阳运行的度数不是时间的二次函数,而是三次函数,以三次差内插算法应用于太阳运行的计算。此外,郭守敬还创制了许多出色的天文仪器,其中最值得一提的是留存至今的登封测景(即影)台。郭守敬通过实测获得了许多精确的数据。《授时历》所采用的一些数据在当时几乎是最精确、最先进的。因此,《授时历》也成为我国历史上施行最久的历法,历时364年。 

这种阴阳合历的历法体系至迟殷商时期就已初见,至汉代历法已有定型的文本并流传至今。

结果是:农历戊子鼠年。

(作者系南京大学天文系教授、中国科学院紫金山天文台客座研究员)

由于一个太阳年的长度约为365.2422日,一个朔望月的长度约为29.5306日,两者之间没有整数倍的关系,12个朔望月的长度约为354天,较太阳年长少11—12天,因而,每隔几个包含12个朔望月的年份就要安排一个包含13个朔望月的年份,多出来的这个月称为闰月。春秋时期闰月的安排还不太规则,一般安排在年末。由于一个太阳年固定地含有12个节气和12个中气(月初的称节气,月中以后的称中气),汉代历法开始采用无中置闰法,即以没有中气的那个月份为闰月。

 

(本文刊于《中国文化报》2015年2月4日第5版)

由于地球绕太阳公转的轨道不是正圆形。实际上相邻两个节气之间的时间间隔并非完全相同。以平均长度计算的节气称为平气,而以太阳的真正黄经位置计算的节气称为定气。与此类似,朔也存在着平朔和定朔的区别。唐初改平朔为定朔,根据日、月同经的实际时刻确定朔望月的初日,节气依然为平气。使用定朔平气注历对传统无中气置闰规则影响不大。清代采用西洋历法。官修历书改平气为定气、定朔,即严格根据日躔行度安排节气。采用"定气"注历后,在太阳视运动较快的季节相邻两个中气的时间间隔就会短于一个朔望月的长度,由此可能出现一个朔望月中包含两个中气的情况,这样在其前或其后的月份虽无中气却不是闰月。故此,清代官修岁次历书中有多次无中气不置闰的安排。现代的农历就是沿袭了清代定朔定气计算历日。

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

圭表

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

圭表是中国古代重要的天文仪器,主要用于测量正午日影长度,确定冬至和夏至,进而确定回归年长度和历法的起算点。

        那么多长时间增加一个闰月比较合适呢?最早人们推算是“三年一闰”,后来是“五年两润”,随着历法计算的精确,最终定型为“十九年七闰”。这个“十九年七闰”又是怎么算出来的呢?其实就是求出回归年日数和朔望月日数的最小公倍数,也就是m个回归年的天数和n个朔望月的天数相等,即:

圭表是由圭和表两部分构成。表是一根垂直竖立在地上的杆子,圭是平放在地上的起标尺作用的部件,放在表的正北方,从圭上的刻度读出表影的长度。表也可不与圭结合而单独使用测量方位,而与圭组合起来的圭表则用来测量正午日影。

m  365.2422 = n  29.5306

由于不同季节太阳在正午时分的高度角不同,表投在圭上的影长也随之不同。在北回归线以北到北极圈以南的地区,正午时分太阳永远在正南方向,冬至日太阳高度角最低,表影最长,夏至日相反。

 

www.bwin8.com,甲骨文中就有可能是正午测日影的卜辞,《周礼》中有"日至之景,尺有五寸,谓之地中"的记载。至迟在春秋时期就形成了用圭表测影确定二至日的方法,当时历法中的置闰法也逐渐走向规则。

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

古文献明确记载西汉长安城的灵台上设置铜圭表,表高八尺,圭长一丈三尺。1965年江苏仪征一座东汉中期墓中出土过一件小型铜圭表,表高为正常尺度的十分之一。

 

为了提高测量精度,需要保证表的垂直和圭面的水平。表的垂直是通过在表上悬挂垂线实现的,圭面的水平则采用了在圭面上开设沟渠的方法,汉代出土的铜圭表模型上已经有了沟渠。

235 – 12  19 = 7

从汉代到清代,中国古代留下了一系列二十四节气正午日影的数据,这是中国古代历法的宝贵资料。

 

中国传统的表高一般是八尺高,也有一丈高和九尺高的。对圭表作出最重大改革的是元代的郭守敬。为了提高观测精度,郭守敬将表高改为四十尺。但是表高增加之后表端投射到圭面的影子就会模糊不清,为了解决这个问题,郭守敬又设计了景符——一个带有小孔的铜片,放在圭面上,有轴可以转动,利用小孔成像原理把太阳的影子投射到圭尺上,这样观测精度大大提高。

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

文献记载郭守敬建造过数个高表,其中河南登封告城镇的高表至今依然存在,现在一般称之为登封观星台。登封观星台实际上是以高台本身作为表,以设置在高台上的一条横梁作为表端,横梁到圭面的高度正好是元代的四十尺。圭面上有刻度,并有沟渠以调整水平。

 

来源:中国纪检监察报

19  365.2422 - 235  29.5306  0.0892

 

这样每213年就会积累约1天的误差,因此,即使按照“十九年七闰”计算,中国农历每一两百年就需要修正一次。正因为这样,现行农历从唐代以后就已经不再遵守“十九年七闰”法,而是采用更准确的“中气置闰”法。“中气置闰”法更准确的名称应该是“定冬至”法,就是定两个冬至节气之间的时间为一个农历年,这样农历年的长度就和太阳回归年长度对应,不会产生误差。

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

        地球沿着一个近似椭圆轨道绕太阳公转,这个公转轨道所在的平面就是“黄道面”,黄道面向外延伸与天球的交线就是“黄道”。古人由于观测条件限制,只能根据视觉感觉认为是太阳沿着黄道绕地球运转,因此设定太阳从黄经(黄道经度)零度起(以春分点为起点自西向东度量),将太阳沿黄经每运行15度所经历的时日称为“一个节气”。太阳每年运行360度,共经历二十四个节气,春季的节气有立春(315度)、雨水(330度)、惊蛰(345度)、春分(0度、360度)、清明(15度)和谷雨(30度),夏季的节气有立夏(45度)、小满(60度)、芒种(75度)、夏至(90度)、小暑(105度)和大暑(120度),秋季的节气有立秋(135度)、处暑(150度)、白露(165度)、秋分(180度)、寒露(195度)和霜降(210度)。冬季的节气有立冬(225度)、小雪(240度)、大雪(255度)、冬至(270度)、小寒(285度)和大寒(300度)。二十四节气又细分为十二节气和十二中气,二十四节气按照顺序排在奇数位置上的就是节气,排在偶数位置上的就是中气。也就是说,立春、惊蛰、清明、立夏、芒种、小暑、立秋、白露、寒露、立冬、大雪和小寒就是十二个节气,而雨水、春分、谷雨、小满、夏至、大暑、处暑、秋分、霜降、小雪、冬至和大寒就是十二个中气。二十四个节气平分在公历的12个月中,每月一节气一中气。二十四节气反映了太阳的周年运动(以地球为参照物的视运动),所以节气在现行的公历中日期基本固定,上半年在6日、21日,下半年在8日、23日,前后不差 1~2天。中国民间流传的《二十四节气歌》就是为了方便记忆这些节气:

春雨惊春清谷天,

夏满芒夏暑相连,

秋处露秋寒霜降,

冬雪雪冬小大寒,

每月两节不变更,

最多相差一两天。

 

传统上一个农历年起于冬至,终于冬至,因此要确定在哪一年置闰,主要看那一年两个冬至之间有几个朔望月,如果是12个朔望月,则不置闰,如果是十三个朔望月,则置闰月,至于闰几月,则要看节气而定。对于有13个朔望月的农历年,置闰月的规则就是从农历二月开始到十月,第一个没有中气的月就是闰月,这个没有中气的朔望月跟在哪个月后面就是闰几月。为什么会有没有中气的朔望月呢?黄道上两个中气之间相隔30度,一个回归年的长度是365.2422日,则两个中气之间的平均间隔是365.2422 12 = 30.4368日,但是因为地球轨道是椭圆轨道,因此相邻的两个中气的时间间隔是不均匀的,比如在远地点附近的中气间隔就会长一点,最长可能是31.45天。而农历的朔望月平均长度是29.5306日,这样就会出现某个朔望月刚好落在两个中气之间的情况,比如,某个月的上一个月月末是一个中气,但是下一个中气落在这个月的下一个月的头几天里,这样这个月就没有中气了。举个例子,2001年农历辛已年的四月二十九(公历5月21日)是小满,农历四月之后的这个朔望月从公历5月23日持续到公历6月20日,而小满后的下一个中气夏至是在公历的6月21日,也就是农历四月的下下个月的初一,这样农历四月后的这个月就没有中气,跟在四月之后,就称为闰四月。

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

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

        中国农历是阴阳合历,需要同时考虑太阳和月亮的位置。所以在确定岁首(元旦)时,需要先确定它在某个季节,然后再选定与这个季节相近的朔望月作为岁首。由于一岁(一个回归年)和12个阴历月并不相等,相差约10.88天,因此每隔三年需要设置一个闰月调整季节。中国上古的天文学家想出了一个简便的方法判断月序与季节的关系,这就是以傍晚时北斗七星的斗柄的指向确定月序,称为“十二月建”。从北方起向东转,将地面划分为十二个方位,傍晚时北斗所指的方位,就是该月的月建,其子月为冬至所在之月,对应十一月,丑月是冬至所在之月的次月,对应十二月,寅月在丑月之后,对应正月。中国在历史上的不同时期,多次修改过岁首(元旦)的起始月份,上古时代就有“三正”之说,所谓“三正”,就是“夏正建寅、殷正建丑、周正建子”,意思是夏历以寅月(正月)为岁首,殷历以丑月(十二月)为岁首,周历以子月(十一月)为岁首。从秦代到西汉前期又采用秦历,秦历建亥,也就是以亥月作为岁首之月,汉武帝太初元年(公元104年)改用太初历,重新适用建寅的夏历,以寅月(正月)为岁首。在这之后的两千多年时间里,除王莽和魏明帝一度改用建丑的殷历,唐武后和肃宗时改用建子的周历外,各个朝代均使用建寅的夏历直到清朝末年。辛亥革命胜利以后,南京国民政府将公历1月1日改为元旦,但是人们仍习惯称农历的正月初一为元旦。新中国成立初期召开的第一届政治协商会议,正式将公历的1月1日确定为元旦,将农历的正月初一定为“春节”,也就是说,农历的岁首仍然采用夏历从寅月(正月)开始。

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

 

1、严格以日月合朔发生时刻为月首,这一天定为初一,通过计算两次日月合朔的时间间隔确定每月是29天还是30天;

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

3、从某一年的冬至后第一天开始,到下一个冬至这段时间内,如果有十三个朔望月出现,则此期间要增加一个闰月,从二月到十月,第一个没有中气的月就是闰月,如果在此期间有超过两个朔望月没有中气,则只有第一个没有中气的朔望月是闰月;

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

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

   

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

        了解了农历历法的基本法则后,就可以根据历法进行农历年历的推算。农历年历的推算是一件很复杂的事情,需要知道每年二十四个节气和本年内每次日月合朔的精确时间,这些时间的获取比较困难。现在有很多可以显示农历的日历软件,其实并不计算这些时间,而是事先从权威机构(如紫金山天文台)获取这些经过推算的时间,然后用各种方法将这些信息存储在设计好的数据结构中。当计算农历时采用查表的方法获取每年的二十四节气日期、大小月情况以及闰月情况,这样的软件受数据量的限制,往往只能显示近一两百年的年历。

        还有一种确定节气时间和朔日时间的方法,就是在已知某个节气或朔日的精确时间后,通过某些规律先前或向后推算其它节气或朔日的时间。有一些经验公式可以用来计算节气发生的日期,比如“通式寿星公式”,可以计算出某一年的某个节气时间,但是只能精确到日。关于“通式寿星公式”的详细内容,请参考文末附加的《小知识2:通式寿星公式》。至于精确的节气或朔日时间,也只能从权威机构获取。以节气的时间推算为例,二十四个节气就是黄道上的24各点,由于地球运动受其它天体的影响,导致这些节气在每年的时间是不固定的,但是这些节气之间的间隔时间基本上可以看作是固定的,下表就是二十四节气的时间间隔表:

 

节气名

与上一节气之间的时间差

与小寒节气的累积时间差

小寒

1271448.00

0.00

大寒

1272494.40

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

 

表(1)二十四节气时间间隔表(单位:秒钟)

 

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

    8 static double s_stAccInfo[] =

    9 {

   10     0.00, 1272494.40, 2548020.60, 3830143.80, 5120226.60, 6420865.80,

   11     7732018.80, 9055272.60, 10388958.00, 11733065.40, 13084292.40, 14441592.00,

   12     15800560.80, 17159347.20, 18513766.20, 19862002.20, 21201005.40, 22529659.80,

   13     23846845.20, 25152606.00, 26447687.40, 27733451.40, 29011921.20, 30285477.60

   14 };

   15 

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

   17 const double base1900_SlightColdJD = 2415025.5868055555;

   18 

   19 double CalculateSolarTermsByExp(int year, int st)

   20 {

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

   22         return 0.0;

   23 

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

   25 

   26     return base1900_SlightColdJD stJd;

   27 

   28 }

base1900_SlightColdJD是北京时间1900年1月6日凌晨2:05:00的儒略日数,CalculateSolarTermsByExp()函数返回指定年份的节气的儒略日数。已知某个朔日的精确时间推算其它朔日时间的方法也类似,以朔望月的长度为单位向前或向后累加即可。

        这种推算的方法是建立在地球回归年的长度是固定365.2422天、节气的间隔是绝对固定的、朔望月长度是平均的29.5305天等假设之上的,由于天体运动的互相影响,这种假设不是绝对成立的,因此这种推算方法的误差很大。以CalculateSolarTermsByExp()函数为例,计算1900年前后30年内的节气时间的误差还可以控制在30分钟以内,但是到2000年的时候误差已经超过130分钟了。人们还总结出了计算节气和朔日时间的两个经验公式,本文末尾附加的《小知识3:计算节气和朔日的经验公式》一节会详细介绍这两个公式,不过这两个公式的结果也只能精确到日,不能提供10秒以内精度的时间。要想精确地获得几千年乃至更长时间范围内任意一年的节气发生时间和日月合朔时间,就只能采用“天文算法”。

 

《继续:天文算法计算农历。。。》

 

TAG标签:
版权声明:本文由必赢亚州手机网站发布于www.bwin8.com,转载请注明出处:时刻如风,算法体系之七十