乙個關於農曆的演算法 js實現

2022-08-27 03:48:07 字數 2154 閱讀 1269

===關於農曆===

農 歷 

農曆是我國的一種曆法,又稱夏曆、中歷、舊曆,俗稱陰曆。定月的方法是用朔望月週期給出,朔所在日為初一,朔望月長約29天半,所以農曆大月30天,小月29天。農曆平年有十二個月,全年354天或355天,閏年為十三個月,其中某一月為閏月,月名依前一月名而定,如前月是八月,閏月則為閏八月。閏年全年383天或384天。

設定閏月的方法是:

農曆月份中無「中氣」的月份則是閏月。

農曆平年、閏年的月數、天數一覽表:

年  月數 大月天數 小月天數 全年天數    閏月設定方法 

平年  12  30    29    354      大約19年中7個閏月 

閏年  13  30    29    383(或384)  無中氣月份為閏月

二十四節氣中四季「節氣」和「中氣」一覽表:

四季 春 夏 秋 冬 節氣 立春 驚蟄 清明 立夏 芒種 小暑 立秋 白露 寒露 立冬 大雪 小寒 中氣 雨水 春分 穀雨 小滿 夏至 大暑 處暑 秋分 霜降 小雪 冬至 大寒

農曆又根據太陽的位置,把太陽年分成二十四個節氣,反映寒冷暑熱的氣候變化,以便家事活動,所以農曆實為陰陽曆。 

如何轉換陰陽曆? 

很多人都一直在找換陰陽曆的公式。我也嘗試過。曾讀過「高平子」天文前輩所著「學歷散論」了解古曆的變更和陰陽曆的缺陷。才知道由於月球轉動的不穩定不規則,確定無公式可尋。這也是古代中國每百年必改歷的原因。 

陰曆最大的問題是在如何置閏。好像不難,因為陰曆基本法則如下:

* 月朔日即是初一 

* 月以中氣得名 

* 以包含雨水中氣月為正月,即是「寅」月 

* 月無中氣者為閏月,以前月同名 

如果,日月轉動循還有規則的話, 推演一套陰陽曆轉換的公式並不難。問題在有時乙個太陰月比乙個太陽月還要長。如此乙個太陰月就有可能包括兩個中氣。此雙中氣月後的陰曆月名就全部亂掉了,直到下乙個「假」閏月後才調整過來。 

一般人接觸到的陰陽曆是民用曆法,它是**頒令的以東經120度計算的曆法或稱中原標準時間或北京時。如果,我們用不同時區、不同經度為子午線來重新計算陰陽曆,民用曆法的置閏法則出了很大的問題。不同時區的閏月可能落在不同月。換言之,在一百年內,任何兩個時區的閏月順序模式是會不相同的。 

高平子前輩書中提到了「歷理置閏法」。如果應用歷理置閏法到不同時區,則所有不同時區的閏月都落在相同月。如此不同時區、不同經度的陰陽曆置閏之問題就消失了。民用置閏和歷理置閏的不同是:

* 在民用置閏,如果月朔日和中氣同一天,則該陰曆月包含那個中氣。

* 在歷理置閏,如果月朔日和中氣同一天,月朔日時間必須在中氣時間之前,則該陰曆月才包含那個中氣。 

簡言之,民用置閏比較月朔和中氣日期;歷理置閏比較月朔和中氣日期、時、分、秒。由此可知,沒有精確的太陽和月亮的時間數字,陰曆的閏月可能會排錯了。 

整理出的太陽和月亮時間數字是從公元1年到2023年。有歷理和中國民用兩套曆法。數字內容清清楚楚的看出民用曆法的敝端。例如,從公元2023年到2023年,民用曆法雙中氣的陰曆月有22個,歷理曆法只有5個。民用曆法甚至在2033、2128和2023年中,三個月之間居然跑出兩個雙中氣;換言之,三個月中多出兩個「假」閏月。前後12個陰曆月中有三個閏月,閏月的去留造成許多學者的討論和困惱。歷理曆法在此三年中,卻沒有發現到雙中氣陰曆月。閏月的去留只要把雙中氣月後的「假」閏月取消,則歷理曆法近乎於完美。

由此可知,民用曆法問題很大,應該廢除。上次陰陽曆重大改曆在2023年,已經超過350年。隨著天文科學的進步,中國陰陽曆應該使用較精確的歷理曆法。免得後代子孫再浪費時間討論置閏去留的問題。 

陰陽曆應用在八字算命、紫微斗數、農民歷、遁甲歷最多。很多人不知道排八字只用陽曆而不用陰曆。發了許多時間在研究陰陽曆的轉換。其實八字只使用太陽中節氣,和月亮沒有任何關係。紫微斗數則需要陰曆日期去排命盤。美國時區的陰曆日期有一半和中國時區的陰曆日期差一天,因為時差超過12小時;初一就可能在不同日之故。有位在加拿大職業算命的朋友,精通八字和紫微斗數,研究其女命盤。八字論父母,合情合理。斗數父母宮,看不出自己影子。後來,在中美天文萬年曆一書發現了「差一天」之解答。 

曾有一位退休博士用了近三十年找尋陰陽曆的公式,問遍兩岸各大天文台,得不到答案,直到發現中美天文萬年曆一書。最後,希望我重新整理的中國陰陽曆的天文數字和原始程式,能給有求知慾於陰陽曆轉換方法的讀友乙個答案,以免得不到答案而遺憾終身。

中國陰陽曆的天文數字和原始程式用簡單英文闡述,

請從 chinese lunar calendar 進入。

關於快速排序演算法的乙個實現

快速排序的意思就是說,對於乙個陣列,隨機從陣列中選取乙個值,然後將陣列裡的其他值與選中的值進行比較,小於選中的值的放在左側,大於選中的值的,放在右側。將選中的數放在中間。對於左邊和右邊的部分分別重複這個過程直到每次處理乙個或者兩個值,全部結束後認為排序完成。以下是實現演算法 public void ...

C 實現的農曆演算法

農曆演算法簡介以及公式 一 節氣的計算 先給節氣進行編號,從近日點開始的第乙個節氣編為0,編號如下及其相應的月份如下 0 小寒 臘月 6 清明 三月 12 小暑 六月 18 寒露 九月 1 大寒 臘月 7 穀雨 三月 13 大暑 六月 19 霜降 九月 2 立春 正月 8 立夏 四月 14 立秋 七...

乙個演算法的實現

某同學幫國外某mm做的題。演算法描述 首先將兩個字串和乙個臨界值作為引數傳入函式,比如 aaaaaaaaaa bbaaababaa 2,然後在函式中依次比較兩個字串的每個字元,當不同的字元數超過指定的臨界值後,繼續比較,並將大於等於臨界值且最大數目的第乙個字串中的相同字元轉換為大寫,比如,根據以上輸...