轉自:http://topic.csdn.net/t/20020905/09/997609.html
中國農歷的算法歸納如下:
1、我國的農歷是一種陰陽歷1912年以前用。
2、我國的農歷強調逐年逐月推算。通過逐月推算后才知道某年某月是大月還 是小月;通過逐年推算后,才知道某年是閏年還是平年。
3、我國傳統歷法一直是陰陽歷和二十四氣並行,二十四氣適用於農業生產。
4、我國傳統歷法采用干支循環(六十甲子)為周期的紀時制度。
歷日的推算有兩條原則:
1、以月相定日序。即以日月合朔的日期和時刻來定每月的初一。
例如,如果今天6時5 分是日月合朔的時刻,則今天是初一。如果第二個 日月合朔落在第30天,那么該月是小月(29天);如果落在第31天,那么 該月是大月(30天);
2、以中氣定月序。 我國的舊歷把全年分二十四個節氣,其中單數的叫節氣,雙數的叫中氣。 以雨水所在的月為正月;以春分所在的月為定為二月;以此類推。
規定,平年有十二個月,閏年有十三個月,在沒有中氣的歷月叫閏月, 把閏月看成是前一月的重復,月序同上一月。
關於節氣與陽歷(公歷)的關系:
節氣是按太陽黃經來划分的,在地球繞太陽轉的每15度為一個節氣,所以 節氣與公歷的日期是相對較固定的,每個公歷平年的節氣位置是固定的;而公歷的閏年的節氣比平年的節氣的位置要前一日。如2000年(閏)其冬至 12月21日,而2001年(平)的冬至是22日的。
實現:
1、公歷中二十四節氣很簡單,
2、農歷要找到一個基准日(日月合朔的日期),才可按逐年逐月推算出日序 與月序;閏年與閏月。
3、再根據干支循環(六十甲子)定年就容易了。
農歷的年、月、日是按照公式計算而來的,不像西歷時強行規定哪月是大月,哪月是小月。要計算大小月、平閏年、閏月放在什么位置,都要按照公式來。下面我們來給出計算的公式。
年份的計算
1 由西元年份推算天干地支:
農歷年份數減3,除以 10 的余數是天干,除以12 的余數是地支。 例如:(2010 - 3) mod 10 = 7,所以天干是“庚” (2010 - 3) mod 12 = 3,所以地支是“寅”。
2.積日的計算(用於月份的計算):
當年的1月0日換算為積日,可以用年份減去1900得到的年數被4整除,所得商數作為 y(D4),余數作為y(M4),y(M4)為零的年份是公歷閏年,積日是
D(1) = 1461 * y(D4) - 1 ,y(M4)不為零的年份是公歷平年,積日是D(1) = 1461 * y(D4) + 365 * y(M4)
月份的確定
計算前一年冬至的積日F(0),並用F(0)計算冬至所在的朔月m及其朔日M(0),就可以推算冬至的農歷日期,冬至所在的農歷月份總是十一月。計算下一個中氣F(1)和下一個朔日M(1),如果F(1)<M(1),那么該月就是上一個月的閏月,並把這個中氣作為F(2),以后的中氣、朔日和農歷月份也這樣確定。
朔日的計算(確定大小月)
從1900年開始的第m個朔日的公式是 M = 1.6 + 29.5306 * m + 0.4 * sin(1 - 0.45058 * m) 這個公式的誤差在0.2天左右。
節氣的計算(確定閏月)
先給節氣進行編號,從近日點開始的第一個節氣編為0,編號如下及其相應的月份如下:
0 小寒臘月 6 清明三月 12 小暑六月 18 寒露九月
1.大寒臘月 7 谷雨三月 13 大暑六月 19 霜降九月
2.立春正月 8 立夏四月 14 立秋七月 20 立冬十月
3.雨水正月 9 小滿四月 15 處暑七月 21 小雪十月
4.驚蟄二月 10 芒種五月 16 白露八月 22 大雪冬月
5.春分二月 11 夏至五月 17 秋分八月 23 冬至冬月
把當天和1900年1月0日(星期日)的差稱為積日,那么第y年(1900年算第0年)第x 個節氣的積日是 F = 365.242 * y + 6.2 + 15.22 * x - 1.9 * sin(0.262 * x) 這個公式的誤差在0.05天左右。
注:經過我的個人驗證,公式 F = 365.242 * y + 6.2 + 15.22 * x - 1.9 * sin(0.262 * x) 的參數改為
F = 365.242 * y + 6.18799 + 15.22567* x - 1.9 * sin(0.2618 * x) 似乎好些。