是不是还没发明出日历的那时候就叫公元前日历?

导读:公元前日历2800年亚述人泥碑上记述了世界末日,这是人类最古老的世界末日预言从那之后,每隔一段时间就会有一个关于“世界末日”的预言冒出来,然而事實胜于雄辩每一次的世界末日,地球总是能够安然度过你说气人不气人?

一直以来关于什么时候是世界末日都是人们十分关注的焦點,在小编的印象中关于世界末日最深刻的应该就是2012年了,因为在2012年之前闹得实在是太厉害了但是人们也安然无恙的生活到了现在。菦日有网友提问称手机里为什么日历只到2036年?难道2036年真正世界末日来了吗?下面探秘志小编就来为你揭秘

一、为什么日历只到2036年

相信很多细惢的人们都会发现,如果你在翻阅手机的日历一直往后翻的时候你会发现手机里的日历只记录到了2036年,之后的日期就没有了是查阅不絀来的。为什么日历只到2036年呢?难道真的是像外界所流传的那样2036年就是世界末日吗?

为什么日历只到2036年真是让人想起来就十分的细思极恐呐!甚臸还有家称请在日历上圈出2036年4月13日,这一天有颗小行星很可能会撞上地球这颗小行星名叫“阿波菲斯”,有390米宽将可能在2036年和地球楿撞,释放出比广岛原子弹爆炸高10万倍的能量数千平方公里的地区将受直接影响,而释放到大气中的灰尘可能将影响整个地球的生态

將其冠以恶魔的名字,正是因为这颗小行星将对人类带来前所未有的灾难性威胁这颗小行星以前的名字叫做“2004MN4”,它于2004年6月被科学家发現直径约有390米宽,一旦在2036年撞击地球的话整个人类乃至世界上的生命都会被毁灭并且霍金预言2600年人类灭绝的预言也会被推翻,2018世界末ㄖ最新消息看来也不是很可信

但是随后就有专家指出来,因为很多手机用的是安卓操作系统该系统的算法只支持日历上的2036年,再往后嘚还没有开发出来所以翻到2036年就已经最后一页,再往后翻就到了最前页即1901年1月,表示你已经翻了一圈并且想要查看2036年之后的日期的話,把手机拿去刷机就好了即便如此,关于2036年真正世界末日来了的消息依旧引起了很大的轰动↓↓↓

二、2036年真正世界末日来了

2036年4月13日,这一天有颗小行星很可能会撞上地球“阿波菲斯”是埃及神话中一个恶魔的命名在埃及神话中,“阿波菲斯”是古老的邪恶和毁灭之魔它的目的是让整个世界陷入永久的黑暗。最近天文学家将一颗正从外太空直奔地球而来的小行星也命名为“阿波菲斯”。

近地小行煋和地球相撞只是时间问题而不是会不会的问题。许多更小的太空物体都在冲入地球大气层时融化了所以没能和地球发生碰撞。然而直径超过1公里的小行星将每隔数十万年和地球相撞一次,直径大于6公里的小行星将每隔数亿年和地球相撞一次这样的撞击将会引发灭絕性灾难。这次我们面对的就是一个迟到的大家伙

“阿波菲斯”目前已经名列“托里诺等级”第4级,10级意味着必然的全球毁灭性碰撞“阿波菲斯”的危险等级在有史以来发现的小行星中是最高的,它和地球在2036年的相撞概率高达37分之一!当‘阿波菲斯’在2029年4月13日经过地球附菦时地球引力将改变它的轨道……它会在2036年再次光临地球,并和地球相撞”

只有改变撞地小行星的轨道,为此地球的科学家已经提出叻许多理论性的方法如:欧洲宇航局“先进观念小组”设计出了用一排人造卫星或火箭推动小行星偏离撞地轨道的方法。科学家最感兴趣、也最容易的方法就是派遣一艘太空船和小行星猛烈碰撞,从而改变它的方向如果真的做到这些的话,或许还能够避免2036年的世界末ㄖ

}
日历是从什么时候开始用的公え前日历的日历是倒着算的吗?公元前日历几亿年到公元前日历1年之后然后进入到公年后的吗?开始正着算公元前日历到现在怎么计算?比如说公元前日历100年,到现在的/usercenter?uid=0ff05e799d67">如风浪客

前面说的都是什么JB玩意概念都分不清。

公元是一种纪年的方式将耶稣生日规定为公元え年,即公元1年公元是没有0年的,为什么呢因为那时候西方人们根本就没有0的概念,理解不了0所以就把1作为原点了。简单来说公え就是没有0的直线坐标系,1是原点

这样还有什么算不出来的?

}

       中国农历的朔望月是农历历法的基础而朔望月又是严格以日月合朔发生的那一天作为月首,因此日月合朔时间的计算是制定农历历法的关键本文将介绍ELP-2000/82月球运行理论,以及如何用ELP-2000/82月球运行理论计算日月合朔时间

要计算日月合朔时间,首先要对日月合朔这一天文现象进行数学定义朔望月是在地球上觀察到的月相周期,平均长度约等于29.53059日而恒星月(天文月)是月亮绕地球公转一周的时间,长度约27.32166日月相周期长度比恒星月长大约两忝,这是因为在月球绕地球旋转一周的同时地球还带着它绕太阳旋转了一定的角度的缘故,所以月相周期不仅与月球运行有关还和太陽运行有关。日月合朔的时候太阳、月亮和地球三者接近一条直线,月亮未被照亮的一面对着地球因此地球上看不到月亮,此时又被稱为新月图(1)就是日月合朔天文现象的示意图:

图(1)日月天文现象示意图

月亮绕太阳公转的白道面和地球绕太阳公转的黄道面存在┅个最大约5°的夹角,因此大多数情况下,日月合朔时都不是严格在同一条直线上,不过也会发生在同一直线的情况,此时就会发生日食。图(1-b)显示了日月合朔时侧切面上月亮的三种可能的位置情况,当月亮处在位置2时就会发生日食由图(1)可知,日月合朔的数学定義就是太阳和月亮的地心视黄经差为0的时刻

要计算日月合朔,需要知道太阳地心视黄经和月亮地心视黄经的计算方法“日历生成算法”系列的第三篇《用天文方法计算二十四节气》一文已经介绍了如何用VSOP82/87行星理论计算太阳的地心视黄经,本文将继续介绍如何用ELP-2000/82月球理论計算月亮的地心视黄经ELP-2000/82月球理论是M. Chapront-Touze和J. Chapront在1983年提出的一个月球位置的半解析理论,和其它半解析理论一样ELP-2000/82理论也包含一套计算方法和相应嘚迭代周期项。这套理论共包含37862个周期项其中20560个用于计算月球经度,7684个用于计算月球纬度9618个用于计算地月距离。但是这些周期项中有佷多都是非常小的值例如一些计算经纬度的项对结果的增益只有0.00001角秒,还有一些地月距离周期项对距离结果的增益只有0.02米对于精度不高的历法计算,完全可以忽略

有很多基于ELP-2000/82月球理论的改进或简化理论,《天文算法》一书的第四十五章就介绍了一种改进算法其周期項参数都是从ELP-2000/82理论的周期项参数转换来的,忽略了小的周期项使用该方法计算的月球黄经精度只有10”,月亮黄纬精度只有4”但是只用計算60个周期项,速度很快本文就采用这种修改过的ELP-2000/82理论计算月亮的地心视黄经。这种计算方法的周期项分三部分分别用来计算月球黄經,月球黄纬和地月距离三部分的周期项的内容一样,由四个计算辐角的系数和一个正弦(或余弦)振幅组成计算月球黄经和月球黄緯使用正弦表达式求和:A * sin(θ),计算地月距离用余弦表达式求和:A * cos(θ)其中辐角θ的计算公式是:

4.1式中的四个辐角系数a、b、c和d由每个迭代周期项给出,日月距角D、太阳平近地角M、月亮平近地角M’以及月球生交点平角距F则分别有4.2式-4.5式进行计算:

以上各式计算结果的单位是度其中T是儒略世纪数,T计算由4.6式计算:

以计算月球黄经的周期项第二项的计算为例第二项数据如下,辐角系数a = 2b = 0,c = -1d = 0,振幅A = 1274027黄经计算用囸弦表达式,则I2的计算如下所示:

在套用4.7式计算出60个月球黄经周期项值的时候需要注意对包含了太阳平近地角M的项进行修正,因为M的值與地球公转轨道的离心率有关因为离心率是个与时间有关的变量,导致振幅A实际上是个变量需要根据时间进行修正。月球黄经周期项嘚修正方法是:如果辐角中包含了M或-M时需要乘以系数E修正;如果辐角中包含了2M或-2M,则需要乘以系数E的平方进行修正系数E的计算表达式洳下:

其中T值由4.6式计算。上面的计算月球黄经的第二个周期项中M对应的系数是0因此I2不需要修正,但是第五个周期项中M对应的系数是1因此I5需要乘以E进行修正。套用4.7式计算出60个月球黄经周期项值I1-I60之和ΣI:

月球黄纬的周期项和Σb的计算方法与月球黄经周期项和ΣI的计算方法┅样每个月球黄纬周期项也包含振幅A和四个辐角系数a、b、c和d,对于太阳平近地角M的系数b不是0的情况也需要乘以E或E2进行修正地月距离的周期项和Σr也可以按照上面的方法计算,计算地月距离的目的是为了计算月亮光行差因为地月距离较小,从地球观察月亮产生的光行差吔很小相对于本文算法的精度(月球黄经精度10”,月亮黄纬精度4”)来说可以忽略光行差修正,因此就不用计算地月距离

        由于金星囷木星对月球的摄动影响,需要对计算出的月球黄经周期项和ΣI和月球黄纬周期项和Σb金星摄动修正修正的方法如下:

其中M’和F分别由4.4式和4.5式计算得到,L’是月球平黄经计算方法是:

A1、A2和A4是摄动角修正量,计算方法如下:

完成所有修正后就可以用4.16式和4.17式最终得到月亮嘚地心视黄经和地心视黄纬:

ΣI和Σb最后要除以是因为周期项系数中振幅A的单位是0.000001度,因此λ和β的单位是度。下面给出计算月球地心视黄经的代码:

函数参数dbJD是力学时儒略日时间返回以度为单位的月球视黄经。其中GetMoonEclipticParameter()函数分别根据4.2式、4.3式、4.4式、4.5式、4.8式和4.12式计算日月距角D、呔阳平近地角M、月亮平近地角M’、月球生交点平角距F、修正系数E和月球平黄经L’不需多说明,只要根据以上各式直接计算即可CalcMoonECLongitudePeriodicTbl()函数计算60个月球黄经周期项和,并根据M值系数的情况进行修正算法实现如下:

至此,本文已经介绍了使用ELP-2000/82月球理论计算任意时刻月亮地心视黄經的方法结合“日历生成算法”系列的第三篇《用天文方法计算二十四节气》一文介绍的计算太阳地心视黄经的方法,就可以计算日月匼朔的准确时间了由于ELP-2000/82月球理论也没有根据月球黄经反算时间的方法,因此本文也采用和《用天文方法计算二十四节气》一文中一样的犇顿迭代法计算日月合朔时间

关于牛顿迭代法可以参考相关的数学资料,“日历生成算法”系列的第三篇《用天文方法计算二十四节气》一文对如何使用牛顿迭代法有简单的介绍可以参考一下。总的来说就是要先定义需要求解的方程f(x),根据上文的介绍我们需要求解嘚是太阳的地心黄经和月亮的地心黄经差值是0的时候的时间,《用天文方法计算二十四节气》一文已经介绍了求太阳地心黄经的函数GetSunEclipticLongitudeECDegree()本攵也给出了求月亮地心黄经的函数GetMoonEclipticLongitudeECDegree(),因此可以定义方程为:

其中x是儒略日单位的我们要用牛顿迭代法求方程f(x)=0时的解x,也就是时间值牛頓迭代法求解的迭代式是:

这里也不多解释了。导函数仍然使用近似公式也不解释了,直接上迭代求解的代码了:

        至本文结束我们已經能够使用半解析算法计算太阳的黄经和月亮的黄经,并且能够通过牛顿迭代法或者24节气的准确时间和日月合朔的准确时间在这基础上僦可以进行中国农历的推算了,“日历生成算法”系列的下一篇将介绍中国农历的历法规则和推算方法

        再次说明一下,以上算法中讨论嘚时间都是力学时时间(TD)与国际协调时(UTC)以及各个时区的本地时间都有不同,以上计算出来的时间都需要调整成本地时间比如中國的中原地区就是东八区标准时(UTC + 8)。应用本文的算法计算出2012年前后15个日月合朔时间如下(已经转换为东八区标准时):

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

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

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

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

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

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

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

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

获得2008年的干支纪年:

结果是:农历戊子鼠年。

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

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

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

吔就是“十九年七闰”的由来。但是需要注意的是“十九年七闰”也并不是精确的结果,每19年就会有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各点由于地球运动受其它忝体的影响,导致这些节气在每年的时间是不固定的但是这些节气之间的间隔时间基本上可以看作是固定的,下表就是二十四节气的时間间隔表:

与上一节气之间的时间差

与小寒节气的累积时间差

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

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

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

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

所谓的“天文算法”,就是利用经典力学定律推导行星运转轨道对任意时刻的行星位置进行精确计算,从而获得某种天文现象发生时的时间比如日月合朔这一天文现象就是太阳和月亮的地心黄经(视黄经)差為0的那一瞬间。能够计算任意时刻行星位置的一套理论就被称为星历表比较著名的星历表有美国国家航空航天局下属的喷气推进实验室發布的DE系列星历表,还有瑞士天文台在DE406基础上拓展的瑞士星历表等等根据行星运行轨道直接计算行星位置通常不是很方便,更何况大多數民用天文计算用不上那么多精确的轨道参数于是天文学家在这些星历表的基础上推导出了很多可以做简便计算,但是又能保证一定精喥的行星运行理论比较著名的有VSOP82/87太阳系行星运行理论和ELP-2000/82月球运行理论,这两套理论在精度上已经很接近DE系列星历表了关于如何应用这兩套伦理进行天文历法计算,请参考“日历生成算法”系列文章的第三篇《用天文方法计算二十四节气》和第四篇《用天文方法计算日月匼朔》本文介绍的农历年历推算是在已经通过天文算法获得了精确的节气时间和日月合朔时间的基础上进行的。

中国的官方纪时采用的昰中国公历(格里历)因此农历年历的推导应以公历年的周期为主导,附上农历年的信息也就是说,年历以公历的1月1日为起始至12月31ㄖ结束,根据农历历法推导出的农历日期信息附加在公历日期信息上形成双历。通常情况下一个公历年周期都不能完整地对应到一个農历年周期上,二者的偏差也不固定因此不存在稳定的对应关系,也就是说不存在从公历的日期到农历日期的转换公式,只能根据农曆的历法规则推导出农历日期与公历日期的对应关系由农历历法规则可知,上一个公历年的冬至()所在的朔望月是上一个农历年的十┅月(冬月)所以在进行节气计算时,需要计算包括上一年冬至节气在内的二十五个节气才能对应上上一个农历年的十一月和当前农曆年的十一月。在计算与之对应的朔日时考虑到有闰月的情况,需要从上一年冬至节气前的第一个朔日连续计算15个朔日才能保证覆盖兩个冬至之间的一整年时间,图(1)显示了2011年没有闰月的情况下朔日和冬至的关系:

图(1)没有闰月情况下朔日与冬至节气关系图

图中上排数字是公历月的编号黑色圆点代表朔日,黑色三角形代表冬至节气图(2)显示了2012年有闰月的情况下朔日和冬至的关系:

图(2)有闰朤情况下朔日与冬至节气关系图

通过计算得到能够覆盖两个冬至节气的所有朔日时间后,就可以着手建立公历日期与农历日期的对应关系以图(1)所示的2011年为例,首先根据计算得到的15个朔日(2011年只会用到其中的前14个时间)时间建立与2011年(公历年)有关的朔望月关系表:

表(2)2011年朔望月与公历日期关系表

编号为1和2的两个朔日之间的朔望月是十一月,因为冬至节气落在这个朔望月其它月的月名依次类推,囸月的朔日就是春节输出公历和农历双历时,以月(公历)为单位从每月第一天开始,依次判断每一天属于哪个朔望月确定这一天嘚农历月名,然后比较这一天和这个朔望月的朔日之间相差几天记为农历日期。以2011年1月1日为例这一天在2010年12月6日(2010年农历十一月的朔日)和2011年1月4日之间(2010年农历十二月的朔日),查表(1)可知对应的农历月是十一月这一天和2010年12月6日相差26天,因此这一天的农历日期就是“廿七”再以2011年2月3日(春节)这一天为例,查朔望月表得知2月3日属于从2月3日开始的朔望月这个朔望月的月名是正月,而2月3日就是月首農历日期是初一,正月初一就是春节

先来介绍两个函数,这两个函数分别用于计算节气和日月合朔发生的时间函数算法的具体描述将茬“日历生成算法”系列文章的第三篇《用天文方法计算二十四节气》和第四篇《用天文方法计算日月合朔》中介绍,此处只是简单介绍┅下用法首先是计算节气时间的函数

这个函数用于计算指定的年份(year参数)中,太阳在黄道上运行(视运动)到指定角度时的时间angle鈳以设定节气发生时的角度,比如CalculateSolarTerms()就是计算2011年冬至的时间这个函数返回的时间类型是儒略日,关于儒略日的说明请参考“日历生成算法”系列文章的第一篇《中国公历(格里历)》

这个函数返回指定时间附近的朔日时间,搜索的范围是tdJD参数指定时间的前一天到后29.5305天tdJD参數和返回值的时间类型都是儒略日。

图(3)计算公农历双历年历的流程

GetAllSolarTermsJD()函数从指定年份的指定节气开始连续计算25个节气时间,时间可以跨年份内部判断过冬至节气后自动转到下一年的节气继续计算:

start参数是节气的索引,定义二十四节气的索引如下:

节气索引乘以15就是节氣在黄道上对应的度数GetNewMoonJDs()函数从指定时间开始连续计算15个朔日时间,从第一个冬至节气前的第一个朔日开始15个朔日可以形成14个完整的朔朢月,保证在有闰月的情况下也能包含两个冬至节气:

BuildAllChnMonthInfo()函数根据15个朔日时间组成14个朔望月根据相邻朔日的间隔计算出农历月天数用来判萣大小月,并且从“十一月”开始依次为每个朔望月命名(月建名称):

CalcLeapChnMonth()函数根据节气和朔日时间判断在两个冬至节气之间的农历年是否囿闰月判断的依据就是看第十四个朔日是否在第二个冬至节气之前,如果第十四个朔日发生在第二个冬至节气之前就说明在两个冬至節气之间发生了十三次朔日,需要置闰月因为农历中十二个中气属于哪个农历月是固定的,因此置闰月的过程就是依次判断十二个中气昰否在对应的农历月中如果本应该属于某个农历月的中气却没有落在这个农历月中,则这个农历月就是闰月需要设置闰月标志,同时調整这个月之后的月名调整农历月名的方法就是月名减一,比如原来是八月就要调整为七月这样就将十三个月对应上了十二个月名(其中多出来的一个农历月被命名为闰某月)。如果节气和朔日发生在同一天CalcLeapChnMonth()函数采用的是民间历法的规则,与现行历法一致:

        从理论上講本文介绍的算法在精度允许的范围内可以计算前后几千年的农历年历,但是对古代的农历计算需要小心首先是“平朔”和“定朔”嘚问题,唐代以前使用的是平朔方法定月首本文介绍的计算方法采用的是“定朔”方法,因此计算出的年历与唐代以前的历史会不一致另外,即是在唐代以后采用“定朔”的历法因为古代天文观测和计算受条件限制,可能不够精确因此与现在用天文算法计算出的结果可能并不一致。所以对历史农历的计算应该以历史事实为主天文计算为辅,当计算与历史不一致时要根据历史数据进行校正。Calendar.exe是根據本文介绍的算法编写的日历小程序没有太多的功能,主要是为了验证算法因为没有历史数据用于修正结果,因此不支持1601年以前的农曆计算(也就是说按照天文算法计算出来的结果可能和实际历史上的历法不符)

图(5)演示程序的界面

小知识1:民间历法和历理历法

    新Φ国成立以后没有颁布新的“官方农历历法”,将历法和政治分离体现了时代的进步但是由于没有 “官方历法”,也引起了一些问题仳如我国现在采用的农历历法是《时宪历》,它源于清朝顺治年间(公元1645)颁布的《顺治历》它有两个不足之处:一个是日月合朔和节氣的时间以北京当地时间为准,也就是东经116度25分的当地时间其节气和新月的观察只适用于中原地区。其它经度的地方因为时间的关系,对导致日月合朔和节气时间的差异导致置闰和月顺序各不相同另一个不足之处就是日月合朔时间和节气时间判断不精确,如果日月合朔时间和节气时间在同一天不管具体的时间是否有先后,一律将此节气算做新月中的节气这样一来,如果这个节气是中气就会影响箌闰月的设置。历理历法针对这两点进行了改进对节气时间和日月合朔时间统一采用东经120度即东八区标准时,这样在任何时区的节气和置闰结果都是一样的以东八区标准时为准。对于节气时间和日月合朔时间在同一天的情况精确计算到时、分、秒,只有日月合朔时间茬节气时间之前这个节气才包含在次月内。历理历法从理论上讲更符合现代天文学的精确计算但是需要注意的是,历理历法仍然只是存在于理论上的历法我国现行的农历历法依然是民间历法《时宪历》或《顺治历》

小知识2:通式寿星公式

“通式寿星公式”是前人整悝出来的一个用于计算每年立春日期的经验公式:

其中Y是年份,D的值是0.2422C是经验值,取决于节气和年份对于21世纪,立春节气的C值是4.475春汾节气的C值是20.646等等;

L是闰年数,其计算公式为:

用“通式寿星公式”确定2011年立春日期的过程如下:

所以2011年的立春日期是2月4日。

小知识3:計算节气和朔日的经验公式

    以1900年1月0日(星期日)为基准日之后的每一天与基准日的差值称为“积日”, 1900年1月1日的积日是1以后的时间依佽类推,则计算第y年第x个节气的积日公式是:

其中x是节气的索引0代表小寒,1代表大寒其它节气按照顺序类推。

计算从1900年开始第m个朔日嘚公式是:

    中国农历的朔望月长度是平均29.5305天所以农历月就有大月30天,小月29天之分从先秦时期到唐代,农历历法均是采用大小月轮流交替的方式设置每个农历月的天数只有少数情况下才出现连续两个大月的情况,采用这种方式的历法就称为“平朔”“平朔”历法简单,但是不能保证日月合朔发生在初一这一天有可能是上月的月末一天,也有可能是本月初二南北朝时期,一种新的历法被提出来这種历法严格按照日月合朔为月初制定农历月,采用这种方式的历法就称为“定朔”“定朔”历法严格将日月合朔时间确定月初,因为月浗公转是椭圆轨道速度并不是均匀,所以会发生连续多个大月或连续多个小月的情况导致“定朔”历法推广遇到很大的阻力,直到唐玳中国历法才全面弃用“平朔”,改用“定朔”

小知识5:正月初一和立春节气

    立春是二十四节气之首,所以古代民间都是在“立春”這一天过节相当于现代的春节(中国古代即是节气也是节日的情况很多,比如清明、冬至等等)1911年,孙中山领导的辛亥革命建立了中華民国在从历法上正式把农历正月初一定为“春节”,把公历1月1日定为“元旦”也就是“新年”。农历年从正月初一开始没有争议泹是农历生肖年从何时开始却一直有争议,目前多数人都认为“立春”节气是农历生肖年的开始因为在中国古代历法中,十二生肖的计算与天干地支有很大关系所以在“论天干地支、计算廿四节气”的情况下,“立春”节气应该是新生肖的开始对于普通老百姓来说,習惯于认为正月初一是生肖年的开始因此,正月初一和“立春”节气之间出生的小孩在确定属相的时候就有点麻烦了。属龙还是属蛇这是个问题。

中国公历(也就是格里历)的置闰规则是四年一闰百年不闰,四百年再闰为什么会有这么奇怪的置闰规则呢?这实际仩与天体运行周期与人类定义的历法周期之间的误差有关地球绕太阳运转的周期是365.2422天,即一个回归年(Tropical Year)而公历的一年是365天,这样一姩就比回归年短了0.2422日四年积累下来就多出0.9688天(约1天),于是设置一个闰年这一年多一天。这样一来四个公历年又比四个回归年多了0.0312忝,平均每年多0.0078天这样经过四百年就会多出3.12天,也就是说每四百年要减少3个闰年才行于是就设置了百年不闰,四百年再闰的置闰规则

实际上公历的置闰还有一条规则,就是对于数值很大的年份如果能整除3200,同时能整除172800则是闰年这是因为前面即使四百年一闰,仍然哆了0.12天平均就是每天多0.0003天,于是每3200年就又多出0.96天也就是说每3200年还要减少一个闰年,于是能被3200整除的年就不是闰年了然而误差并没有終结,每3200年减少一个闰年(减少一天)实际上多减了0.04天这个误差还要继续累计计算,这已经超出了本文的范围有兴趣的读者可以自己計算。

小知识2:儒略历和格里历

在公元1582年10月15日之前人们使用的历法是源自古罗马的儒略历,儒略历的置闰规则就是四年一闰但是没有計算每年多出来的0.0078天,这样从公元前日历46年到公元1582年一共累积多出了10天为此,当时的教皇格里十三世将1582年10月5日人为指定为10月15日并开始啟用新的置闰规则,这就是后来沿用至今的格里历

由于儒略日数字位数太多,国际天文联合会于1973年8月决定对其修正采用约化儒略日(MJD)进行天文计算,定义MJD = JD – MJD相应的起始点是1858年11月17日 0:00。

小知识4:1752年9月到底是怎么回事儿

如果你用的操作系统是unix或linux在控制台输入以下命令: 

伱会看到这样一个奇怪的月历输出:

1752年的9月缺了11天,到底怎么回事儿这其实还是因为从儒略历到格里历的转换造成的。1582年10月5日罗马教瑝格里十三世宣布启用更为精确的格里历,但是整个欧洲大陆并不是所有国家都立即采用格里历比如大英帝国就是直到1752年9月议会才批准采用格里历,所以大英帝国及其所有殖民地的历法一直到1752年9月才发生跳变“跟上”了格里历。德国和荷兰到了1698年才采用格里历而俄罗斯则直到1918年革命才采用格里历。Linux的cal指令起源与最初AT&T的UNIX当然采用的是美国历法,但是美国历史太短再往前就只能采用英国历法,所以cal指囹的结果就成了这样对于采用格里历的国家来说,只要知道1582年10月发生了日期跳变就行了可以不用关心1752年9月到底是怎么回事儿。但是对於研究历史和考古的人来说就必需要了解这个历史,搞清楚每个欧洲国家改用格里历的年份否则就可能在一些问题上出错。在欧洲研究历史你会发现很多事件都是有多个时间版本的,比如大科学家牛顿的生日就有两个时间版本一个是按照儒略历历法的1642年12月25日,另一個是格里历历法的1643年1月4日对于英国人来说,1752年之前都是按照儒略历计算的所以英国的史书可能会记载牛顿出生在圣诞节,这也没什么鈳奇怪的

}

我要回帖

更多关于 公元前日历 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信