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

By admin in 天文台 on 2018年11月14日

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

 

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

农历–以天文月作为日历的基本点周期,例如:伊斯兰历

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

 

我国古人好已经起关心天象,定昼夜交替为“日”,月轮盈亏为“月”,寒暑交替为“年”,在总日月变化规律的基础及制定了兼闹阴历月和公历年性质的历法,称为中国农历。本文将介绍中国农历的历法规则、天干地支(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]);

结果是:农历戊子鼠年。

 

       
中国农历是因嫦娥运行周期也根基,结合太阳运行规律(二十四节气)制定的历法,农历月之定义规则就是是神州农历历法的主要,因此而打听中华农历的历法规则,就必知道怎么定义月,如何设置闰月?中国农历的一样年有十二个月要十三个月,但是正式的叫法只发生十二只月,分别是元月、二月、三月、四月、五月、六月、七月、八月、九月、十月、冬月和腊月(注意,正统的华农历是绝非十一月同十二月之,如果你用底历法软件来显示农历十一月跟农历腊月,就印证很不规范)。中国民间常用“十冬腊月天”来描写寒冷的天气,其实指的饶是十月,十一月同十二月立即三单极冷之月。一年起十三独月的情是坐发闰月,多下的之闰月没有月名,只是和在某月后,称为闰某月。比如公历2009年对应的农历乙丑年,就是闰五月,于是就等同年可过少单端午节。

       
中国农历为什么会生出闰月?其实中国农历置闰月是为了协调回归年及农历年的龃龉。前面提到了,中国农历是同样种阴阳历,农历的月分大月和小月,大月一个月份是30上,小月一个月是29龙。中国农历把日月合朔(太阳和月球的黄经相同,但是月亮不可见)的日子定位月首,也就是是“初一”,把月完美之时段势必为望日,也不怕是“十五”,月亮绕地球公转一健全称一个朔望月。天文学的朔望月长度是29.5306天,中国农历以朔望月为根基,严格管教每个月之条一天是初一,这就算使每个月是大月还是略微月之配置未可知稳,通常要经天文学观测和计算来确定。一个农历年由于12单朔望月组成,这样一个农历年之长就是29.5306  12 =
354.3672日,而阳历之一个天文学回归年是365.2422日,这样一个农历年就比较一个回归年少10.88上,这个误差如果累计起来过16年就会起“六月份竟然雪”的奇观了。为了协调农历年与回归年之内的龃龉,聪明的先人在天文观测的功底及,找到了“闰月”的方,通过当合适的月度插入闰月来管每个农历年的正月到三月凡青春,四月到六月是夏天,七月至九月是秋,十月及十二月凡是冬,也就是说,让历法与天文景象能够基本对直达,不至于出现“六月竟然雪”。

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

m  365.2422 = n
 29.5306

 

这么m和n的比重就是29.5306 : 365.2422
 19 :
235,按照这极接近的整数倍关系,每19只回归年要加上的闰月就是:

 

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秒之内精度之日。要惦记准确地获得几千年乃至更丰富时限定外随机一年的节气发生时和日月合朔时间,就只能使用“天文算法”。

 

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

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2018 亚洲必赢手机官网 版权所有