atitit.农历的公式与原理以及农历日期运算
1. 农历的概述
我国现在采用的农历历法是《时宪历》,它源于清朝顺治年间(公元1645)颁布的《顺治历》,它有两个不足之处:一个是日月合朔和节气的时间以北京当地时间为准,也就是东经116度25分的当地时间,其节气和新月的观察只适用于中原地区。其它经度的地方,因为时间的关系,对导致日月合朔和节气时间的差异导致置闰和月顺序各不相同。另一个不足之处就是日月合朔时间和节气时间判断不精确,如果日月合朔时间和节气时间在同一天,不管具体的时间是否有先后,一律将此节气算做新月中的节气,这样一来,如果这个节气是中气,就会影响到闰月的设置。历理历法针对这两点进行了改进,对节气时间和日月合朔时间统一采用东经120度即东八区标准时,这样在任何时区的节气和置闰结果都是一样的,以东八区标准时为准。对于节气时间和日月合朔时间在同一天的情况,精确计算到时、分、秒,只有日月合朔时间在节气时间之前,这个节气才包含在次月内。历理历法从理论上讲更符合现代天文学的精确计算,但是需要注意的是,历理历法仍然只是存在于理论上的历法,我国现行的农历历法依然是民间历法《时宪历》或《顺治历》。
作者:: ★(attilax)>>> 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
2. 如何在电脑程序里面计算农历??
理论上,显示农历与显示公历一样的方便。It领域,内部时钟也并不使用公历,公历的大纪元是耶稣诞生的0年开始的。It领域的使用的是时间戳方式,大纪元是Unix 纪元
it领域中有一种常用的计算时间的方法:Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)
所以只要有完整的农历推算公式即可 从时间戳换算到农历。
3. 农历的公式
有人说农历没有精确的公式,这是错误的,农历有精确的公式,不然怎么推算出来未来的万年历呢。。
农历历月的天数只有29日和30日两种
农历的大小月是完全不固定的, 这就使得大小月的安排不固定,而需要通过严格的月相观测和计算来确定。因此,农历中连续两、三个月是大月或是小月的事是常有的,甚至还出现过如1990年九、十、十一、十二连续四个月是大月的罕见情况。
二、农历闰月的大月和小月设置也有规律农历闰月一般为29天,是小月。但也有例外——那就是:按上述农历大小月的设置办法,将零头数累加到正好有一天的那一个月如果正逢闰月,就把这多出的一日加在这个闰月上,那么这个闰月就有了30天,成了大月了。
四、农历规则在古代,日的定义:以地球自转一周为一日。其中以太阳离地平线最远的一个时辰为子时,相当于北京时间23:00~1:00。但是农历中一天始于子正(0:00),而非子初(23:00)。月策与置末规则:朔日为每月起点(初一日);朔日(月初一日)到下个朔日(下月初一日)有多少天、这月就有多少天。有30天为大月、有29天为小月;唐朝武德二年(公元619年)以前用的是平朔,武德二年(公元619年)以后用的是定朔。年策与置闰规则:以冬至日必须在子月(寅正十一月),上个冬至月(寅正十一月)到下个冬至月如有12个月就不置闰,如有13个月就要置闰,以上个冬至月之后第一个无中气的月份为闰月,在几月后面就称闰几月。 例如:壬子年(2032)冬至月到癸丑年(2033)冬至月之间有12个月,就不置闰。癸丑年(2033)冬至月到甲寅年(2034)冬至月有13个月就必须置闰,在癸丑年(2033)冬至月(十一月)后的第一个无中气之月是该月的下一个月,就定为闰月。它正好十一月后,所以就叫闰十一月。
其二可以利用公式推算阴历日期: 设:公元年数-1977(或1901)=4Q+R 则:阴历日期=14Q+10.6(R+1)+年内日期序数-29.5n (注:式中Q、R、n均为自然数,R<4) 例:1994年5月7日的阴历日期为: 1994-1977=17=4×4+1 故:Q=4,R=1 则:5月7日的阴历日期为: 14×4+10.6(1+1)+(31+28+31+31+7)-29.5n =204.2- 29.5n 然后用29.5去除204.2得商数6......27.2,6即是n值,余数27即是阴历二十七日。
首先,此算法存在精度问题,±1天属正常现象(非四舍五入问题)。
其三,此算法只能得到日数,不能得到月数
一般人接触到的阴阳历是民用历法,它是政府颁令的以东经120度计算的历法或称中原标准时间或北京时。如果,我们用不同时区、不同经度为子午线来重新计算阴阳历,民用历法的置闰法则出了很大的问题。不同时区的闰月可能落在不同月。换言之,在一百年内,任何两个时区的闰月顺序模式是会不相同的
4. 获取当日农历日历
原则上,只要有时间戳,在加上农历日期运算即可得到当日 农历日期。。
但是 农历公式以及农历日期运算比较复杂。目前可能查表法比较好的一个方式,或者从公历转算。。
5. 历史日期公式加查表才能得到精确日期
因为公历(现在用的是格里历,以前还曾用儒列历)和中国农历都不是严格按一个公式计算得到的,所以两个历法没有直接的公式。 试图用一个简单的公式,而不利用许多像万年历一样的数据(尽管可以简化),就达到公农历转换的目的,这是不可能的
于公历和农历的置闰,倒都有一定的方式推算,并不困难。
如果只是天文数据,其实都还是可以算的——因为天文周期十分稳定,我们只要严格地按天文周期推算就可以了。可是还有更为麻烦的一点,就是公历和农历这些历法,并不是完全严格地按照天文上的实际周期进行的,还有许多人为的因素。最著名的就是罗马皇帝几次修改2、8等月份长短,以及儒列历中因计算不准确而人为地去掉了十天等事。中国农历也有因为古代天文观测不准确造成的政府颁布的历法与天象不吻合的(我们不能苛求古人观测的精度)。所以这两部历法都是与一个时期社会有关的东西,也就没有一定的规律可循了。
从理论上讲,本文介绍的算法在精度允许的范围内可以计算前后几千年的农历年历,但是对古代的农历计算需要小心。首先是“平朔”和“定朔”的问题,唐代以前使用的是平朔方法定月首,本文介绍的计算方法采用的是“定朔”方法,因此计算出的年历与唐代以前的历史会不一致。另外,即是在唐代以后采用“定朔”的历法,因为古代天文观测和计算受条件限制,可能不够精确,因此与现在用天文算法计算出的结果可能并不一致。所以对历史农历的计算应该以历史事实为主,天文计算为辅,当计算与历史不一致时,要根据历史数据进行校正。Calendar.exe是根据本文介绍的算法编写的日历小程序,没有太多的功能,主要是为了验证算法,因为没有历史数据用于修正结果,因此不支持1601年以前的农历计算(也就是说按照天文算法计算出来的结果可能和实际历史上的历法不符)
6. 参考
算法系列之二十:计算中国农历(二) - oRbIt 的专栏 - 博客频道 - CSDN.NET.html