kowala's home

kowala's home
這裡是我的學習筆記,陸續增加中。
http://kowala21.blogspot.com

2012-09-09

農曆程式概念探討(4)

kowala's home
http://kowala21.blogspot.com

農曆規則與置閏

開始進入農曆主演算法,原作是採用查表法,對于如何排定表,如何取出對應的日期,後面均會做一說明,但開始前,先對農曆規則做一簡要說明。

一個月,就是月亮繞地球一圈,就是月相由新月(朔)循環到新月(朔)所經過的時間(圖一),平均為 29.530588天(29天12小時44分2.8秒)[1],月球繞地球轉動,又被地球帶著繞日公轉,所以它的軌跡是呈現螺旋前進(圖二),這使得它的計算比地球對日要來得複雜些。

圖一,月相循環


新月(朔)就是月球在地球與太陽一直線上,定義為一個月的開始日。

圖二,月球螺旋前進軌跡模擬計算

十九年置七閏

由月球繞地一周為一個月來推算月球繞日會發現,它的實際月數與陽曆的月數不相符,這必須調整,就好像陽曆 4 年一潤,補一天一樣,但如何去補,這就是十九年置七閏的由來。

月亮繞地球一圈平均為 29.530588 天,一年通常有 12 朔望月 = 354.367056 日,這與回歸年 365.2421990741 日,少了 10.8751430741 日,取其差最少為19年+7閏月。

19 回歸年 365.2421990741*19 = 6939.6017824079 日
十九年置七閏 = (19*12+7)*29.530588 = 6939.68818 日

兩者的天數幾乎相等,因此每隔 19 個回歸年,陽曆與農曆再次同步。


置閏規則

觀察朔日定為每月初一,並應該與節氣配合,合理分配24節氣,這樣才是能夠實用的曆法,一年有24節氣,然而12 朔望月僅僅只有354.367056 日,與回歸年 365.2421990741 日短少,使得24節氣無法平均分配,如何合理分配,何時補足差的日數,這便是置閏規則。

圖三,月相變化圖
 
通常以立春及雨水定在一月裡,跟著以驚蟄及春分定二月,若是閏年就加多一個閏月,但一年 365 天裡只能出現十二個中氣,所以就把沒有中氣的那個月份作為閏月,例如閏二月、閏三月 … 閏十一月,但不會出現閏十二月和閏一月,因為這時地球位於近日點附近,速度較快掃過角度大,故此十二月和一月必有中氣和節氣出現,其他月份較有機會出現無中氣[2]。


編表規則

由於大小月出現並無一定規則,為了準確及簡化計算,我們必須找尋一個標準來制定對照表,這裡以香港天文台公佈的公曆與農曆日期對照表[3]為例來說明編表規則。


由上表可以得知1901年沒有閏月,從1月到12月的天數依次為:
29、30、29、29、30、29、30、29、30、30、30、29。

令大月為1,小月為0,則可以表示為

0100 1010 1110  (不包含閏月)

以16進位表示則為

0x4ae

我們可以用小算盤來轉16進位碼


再把閏月的月份擺在右邊,無閏月設為0

0x4ae0

再以閏大月為1,閏小月為0,擺在左邊

0x04ae0

這樣就完成了編表,以下再舉幾個範例


1982年的數據是:0x0a974
0000 1010 1010 0111 0100
表示1982年的4月為閏月,即有第二個4月,且是閏小月。
從1月到13月的天數依次為:
30、29、30、29、29(閏小)、30、29、30、29、29、30、30、30。

2017年的數據是:0x15176
0001 0101 0001 0111 0110
表示2017年的6月為閏月,即有第二個6月,且是閏大月。
從1月到13月的天數依次為:
29、30、29、30、29、29、30(閏大)、29、30、29、30、30、30。

從1900年到2061年的編表如下

var lunarInfo=new Array(
0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,
0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,
0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,
0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,
0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,
0x06ca0,0x0b550,0x15355,0x04da0,0x0a5d0,0x14573,0x052d0,0x0a9a8,0x0e950,0x06aa0,
0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,
0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b5a0,0x195a6,
0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,
0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,
0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,
0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,
0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,
0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,
0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,
0x14b63);

待續...

參考資料
1.  维基百科干支  http://zh.wikipedia.org/wiki/朔望月
2.  廿四節氣和閏月 http://forum.hkas.org.hk/viewthread.php?tid=4430
3.  公曆與農曆日期對照表  http://www.hko.gov.hk/gts/time/conversionc.htm

圖一,http://www.cwb.gov.tw/V7/knowledge/planning/sun_moon.htm
圖二,http://blog.sciencenet.cn/blog-362400-278987.html
圖三,http://blog.udn.com/chyyang01/5732435

沒有留言:

張貼留言

請提供您的寶貴意見 ;-)