2010-07-26

Calendar (曆法)

曆法,是記錄時間的方法。

古人發現,地球的氣候,與地球的公轉有關。因此,地球繞著太陽轉一周,期間春耕秋收,叫一「年」。由地球的潮汐漲退,到生物的生理週期,又與月亮的盈虧有關。因此,月亮盈虧一次的時間,叫一「月」。日出日落,又為之一「日」。為了方便溝通,又將一日早晚分為均等的十二個「時」,時又可以再均等分為「刻」與「分」。

古人接著記下:一年有大概十二個月,每個月大概又有三十日。因此,一年大概有三百六十日。從此,三百六十變成西方古文明的單位,好像一個圓便有三百六十度。

至於代表東方文明的中國,用的,是十二與三十的最少公倍數:六十。它能被三十除盡,又能被十二除盡,天體的變化因此每六十個週期便重疊一次。

為免造六十個符號作單位,中國人發明了十個天干與十二個地支,最少公倍數正是六十;它們分別是:
  • 甲、乙、丙、丁、戊、己、庚、辛、壬、癸
  • 子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥
古史書《世本》記載了「容成作曆,大橈作甲子」、「二皆黃帝之臣」、「甲乙之名日,謂之干;作子丑之名月,謂之支」;換言之,根據傳說,早於黃帝時期便有干支曆法。第一個甲子年,正是黃帝於公元前 2697 年時登基的那一年;古人稱黃帝元年。

數的時候,就從甲子、乙丑、丙寅等,一直數到癸亥。留意單數干 (甲、丙、戊等) 是不會與雙數支 (丑、卯、巳等) 相配。因此單數排位的干支為「陽」,雙數的為「陰」。

中國的曆法,就是以甲子年、乙丑年等一年一年地數下去,每六十年循環一次;又以甲子月、乙丑月等一月一月的數;由於一年有十二個月,所以每逢一月便是寅月。日也是一樣,由甲子日、乙丑日等開始數,每六十日完成循環。時辰也是一樣,每天由晚上十一時開始,每兩小時一個時辰,由甲子時開始,五日後便又回到甲子時。一個時辰再分為八刻,一刻有十五分。

到了宋代邵雍,即著名的邵康節,更推而廣之,創下以「元會運世」為單位的宇宙曆。簡而言之,世界由始到終為一「元」,一元有十二「會」,一會有三十「運」,一運有十二「世」,一世又有三十「年」。也就是說,一元有 129,600 年。自然地,十二會以地支為編號、三十運則以干支配合來數。他的曆法,由堯帝登基時五星連環的那一刻開始。

由始推出一個結論:在六十年裏任何一個時辰,都可以用四組干支,或八個中文字代表:這就是所謂「八字」;它們分別構成年柱、月柱、日柱、時柱等「四柱」。之後就每六十年循環一次,直至永遠。

在這裏,我同時想介紹如何用 Excel 計算任何一個時刻的四柱。由於 1984 年是「甲子」年,只要算出今年與 1984 的差,再除六十後的餘數,便可以知道今年的干支。算餘數的函數為 MOD。假如你將今年年分輸入 A1 的格內,又設定甲子是 0,乙丑是 1,丙寅是 2 等,那:

=MOD(A1-1984, 60)

便會得出除 60 的餘數。要化為年干,只要除 10 得餘數,0 為甲、1 為乙等;化年支則除 12,0 為子、1 為丑。當然,你也可以加 1,讓結果變成 1 為甲、為子。

可以說,算年干是最容易的。起月柱亦不難。既然一年有十二個月,每逢農曆一月便是寅月。至於月干,由於有十個,每六十個月便會循環一次,亦即每五年就會有一次甲寅月,逢甲或己年,正月便一定是丙寅月。古人於是設計了一首「五虎遁月」歌:

甲己之年丙作首,乙庚之歲戊為頭,
丙辛必定尋庚起,丁壬壬位順行流,
更有戊癸何方覓,甲寅之上好追求。

為什麼叫「五虎」?因為「寅」代表虎,寅年就是虎年。同樣道理,一日有十二時辰,每五日便會遇上一次甲子時。子又代表鼠,故有「五鼠遁日」歌:

甲己還加甲,乙庚丙作初,
丙辛從戊起,丁壬庚子居,
戊癸何方法,當從壬子求。

即每逢甲日或己日,就由甲子時數起。乙日庚日,就由丙子時數起。

到此,你會問我究竟想做什麼?原來自古中國曆法有一難題,就是起日柱。如果每個月都是三十日,就很簡單:兩個月便循環一次;問題出在每一個月的日數不一樣,又無算式可跟。舉例,正月初一是定在冬至後的第二次新月、大寒後的第一次新月、或最近立春的新月。月,顧名思義,是根據月亮盈虧來定的;但「冬至」、「大寒」、「立春」等「節氣」,則是由公轉、亦即太陽與地球的距離來釐定的。冬至正是日照最短的一天,一般落在子月 (即十一月)子是開始,由子月冬至開始,日照便越來越長,所謂「陽火之始」、「冬至一陽生」,所以「做冬大過年」。子月更曾經是周代的歲首,即新年。寅月為歲首,是夏朝留下來的傳統。五天為一「候」,三候為一「氣」,六候則為一「節」,一年於是有十二個氣、十二個節,為二十四節氣。

在人類的曆法上,以羅馬代表的西方文明,是用以太陽為主的數學曆 (Arithmetical Calendar);以阿拉伯世界為代表的東方文明,是用以月亮為主的陰曆;只有中國人用日月兼備的天體曆 (Astronomical Calendar),應該是全世界最複雜的 (Aslaksen, 2009)。我們用「年」和「節氣」來標誌太陽的週期,再用「月曆」來標誌月亮的盈虧,以至沒有萬年曆,根本推算不出每一天的日柱。

用數學曆的公曆,能輕易地讓你算出兩個日期之間相隔多少日,因為閏月閏年都是有公式計算的。但是你也許沒留意,中國農曆並不是每隔一年便有閏月。有時是隔一年,有時是隔兩年,要看日月位置!每個月亦不是一定有三十日,也不是一月大二月小這樣數。二、三、四、五、六、八等月都有可能有閏月!這樣做,有個公曆做不到的效果:就是每逢初一都是新月、每逢十五都是滿月。

因此,所有算命的師父,手邊都有萬年曆,否則無法憑簡單的出生年月日推算出八字。為什麼要算八字?因為中國人相信,我們一生的命運、健康、財富、官職等,以及每年的吉凶,都是註定的,並能由代表出生時間的四柱八字推算出來。不過,不同的派別在用不同的曆法。批八字的,用陽曆,以立春為一年之始,以出生日與節氣的距離除三為起大運的歲數;批紫微的,用陰曆,以正月初一為一年之始,以逆數月順數時等方法安身立命算大限。算鐵版的,集大成,陰陽曆皆用,還要考刻:要知道你出生在那時辰的那一刻。若你不清楚,他們便問你父母生肖等資料,以確定你的刻數。由於要求這樣精確,推出的條文亦更細緻。以我所知,只有鐵版才會直接談到你壽元有多長,死於何時,身邊有幾多子女送終!

那麼,盲人師父讀不到萬年曆,豈不吃虧?這就要提到據說千金難求的「大小金鉗訣」。盲人師父憑訣便能起八字。「大小金鉗」是我遇過最高度加密的口訣;它記下了由 1930 年到 1990 年 71 年間每個正月初一的日柱、整年的大小月分佈、和立春的時間,但你若在什麼仙洞裏看到它,肯定不知它在說什麼。讓我分享開首兩句,你便明白:

白龍隨井六戌飛,黑兔家解丑十八。……

第一句「白龍隨井六戌飛」的「白龍」,指的是 1930 年 (庚午) 的正月初一是「庚辰」日。「龍」是第五個生肖,故代表「辰」;「白」是金的顏色 (見《起卦》裏的五行圖),而天干中「庚、辛」都屬金。不過「辰」是陽支,不會配「辛」這陰干,故「白龍」只會是「庚辰」。「隨、井」嘛,是兩個卦象的名字!「澤雷隨」與「水風井」,或「澤雷水風」,由上往下數,陽爻為大月 (30 日),陰爻為小月 (29 日),便是「小大大小小大、小大小大大小」。「六戌」,是指立春在初六戌時。那是十二月初六還是正月初六呢?那就看「戌」在「六」之前還是之後。現在是在後,所以是正月,否則就是新年前,即十二月。同樣地,1931 年的正月初一是癸卯日,立春在十二月十八丑時。

有了這七個字,就能為全年每一個時辰算出四柱八字,而無需萬年曆。我最欣賞的,是這口訣壓縮字數的加密法,真是少點基礎都看不明白。至於全套大小金鉗訣,已有高人在網上發佈,我就不再轉載了。另有一套叫「銀盤子」的口訣,讓人快速背出每年氣節交替的日子與時辰,亦已有高人發表,不贅。

可是,大家記住的出生日期,大都是公曆的,很少人記住自己的農曆生辰。這樣做成了另一個挑戰,就是要先將公曆轉農曆。認識我的朋友,到此可能已估到我想做什麼:我其實是想用 Excel 的函數,把公曆轉換成農曆,再起四柱八字。你也不用找了:網上無數的萬年曆,背後大都是一個表,記住了農曆每個月初一的公曆日子,再每次查出來相減;所以全部都有一個輸入年份的有效範圍。就算楊河理與熊曉東先生最近的論文 (Yang & Xiong, 2006),也沒有離開「大小金鉗訣」的模式,只是用二進制數字來代替卦名罷。

由於公曆是以數學為基礎的,要轉換農曆便十分因難,中間要對天體運作有很深的認識;特別是起月柱的時候,要先知道月圓月缺的時間。但是,由公曆起日柱卻竟變得相對容易:因為四柱八字其實是一個數學曆,純粹一個以六十為單位的循環,故此有條件造成方程式。只要你找一個甲子日為基準,再與你查的日子相減,再為中間公曆農曆的閏年閏月做調整,便能得出任一日的日柱。

正當我雄心壯志,想訂出這個由公曆算日柱的方法時,卻發現已有人捷足先登,那就是張雲鶴先生的《張氏日柱公式》(Zhang, 2008)。張氏的公式,需要知道那一年是否公曆閏年,可用這個 Excel 公式來決定 ([年] 是 Excel 裏輸入了年份的位置):

[閏}:=IF(OR(AND(MOD([年],4)=0,MOD([年],100)<>0),MOD([年],400)=0),1,0)

張氏的基數:

[基數]:=5*[年]-60*FLOOR([年]/12,1)+FLOOR([年]/4,1)-FLOOR([年]/100,1)+FLOOR([年]/400,1)+[月]*30-59*FLOOR([月]/2,1)+FLOOR([月]/9,1)-FLOOR([月]/10,1)+FLOOR([月]/11,1)-FLOOR([月]/12,1)+FLOOR(2/[月],1)+[日]+38+IF(AND([月]=1,[閏]<>0),-1,0)+IF(AND([月]=2,[閏]=0),1,0)

[基數] 除 10 的餘數就是日干 (0 = 甲)、除 12 的餘數是日支 (1 = 子)。

現在你也可以用 Excel 做萬年曆。如果有朋友記得自己的公曆與農曆生日,你可以不用萬年曆便能為他起四柱八字。你亦可以以它為基礎,配合 VBA 來排紫微斗數命盤。自己有自己的程序,便能將解盤的心得都寫進程序,不用金睛火眼的在三方四正數星星,又不用靠想像將大限流年的盤轉來轉去。你甚至可以自動為四柱起卦納甲排六親,再在網上下載鐵版神數的一萬二千條條文,排出一生命書。簡直可謂:

算命不求人,只需按 Button!

這是有點誇張。始終解盤、考刻等工作還是要人工處理。想算命的人亦是想傾訴多於想知道未來。越扯越遠,我還是在未完全離題之前,就此打住吧。

Reference:
Aslaksen, H. (2009). The Mathematics of the Chinese Calendar. Retrieved from http://www.math.nus.edu.sg/aslaksen/calendar/chinese.shtml

Yang, H. & Xiong, X. (2006). The Conversions between the Gregorian Calendar and the Traditional Chinese Calendar in the Electronic Perpetual Calendar. Retrieved from http://www.paper.edu.cn/index.php/default/releasepaper/content/10479

Zhang, Y. (2008). Zhangyunhe Rizhu Formula: Mathematical Formula to Convert a Certain Day from the Gregorian Calendar into the Heavenly Stems and the Earthly Branches. Journal of Yancheng Institute of Technology (Natural Science Edition), 21(2), Retrieved from http://d.wanfangdata.com.cn/Periodical_ycgxyxb200802004.aspx

4 則留言:

匿名 說...

1月2日 - 2月1日算出來有錯誤!

狂人 - Paul Sin 說...

你是指《張氏日柱公式》?如何出錯,還望指正。不過此文年距今超過一年,小弟研究東西又三分鐘熱度,可能要點時間才能記起細節並改正過來。

匿名 說...

對不起!原來是我的公式出了差錯,尤甚是如那一年二月份有29天就會出錯誤,但我己改正了。謝謝!

狂人 - Paul Sin 說...

沒問題!