文章出處

    作為21世紀的新青年,不會干支的程序員肯定不是一個好司機,中華文化源遠流長,古代文明令人欽佩不已,十二地支對應十二個時辰(一個時辰等于兩小時),又暗合十二生肖,每個生肖又對應著五行和陰陽屬性,五行之中又相生相克,而天干同樣有對應的五行陰陽,五行陰陽又暗合日月星辰和方位,利用占卜可以得吉兇,扯遠了,再說下去估計就變成神棍了,言歸正傳, 天干地支組成形成了古代紀年歷法。十天干和十二地支依次相配,組成六十個基本單位,兩者按固定的順序相互配合,組成了干支紀元法,為60甲子表,也就是幾時幾刻。

    十大天干: 甲 乙 丙 丁 戊 己 庚 辛 壬 癸

    對應編號: 1  2  3  4  5  6  7  8  9  10

    十二地支: 子 丑 寅 卯 辰 巳 午 未 申  酉 戌  亥

    對應編號: 1  2  3  4  5  6  7  8  9  10 11 12

    關于年支紀年法,百度是這樣介紹的 

   ①年干公式:年干=公元年個位數-3 (個位小于3,加10)
     例:求1899年,1911年和2015年天干?
     解:1899年干=9-3=6=己,1911年干=1-3+10=8=辛,2015年干=5-3=2=乙
   ②年支公式:
   (公元年末二位數-11)-12*N=年支(適用于20世紀,即1900—1999年)
   (公元年末二位數+5)-12*N=年支(適用于21世紀,即2000—2099年)
對于年支計算,具有局限性,20世紀、21世紀算法都不一樣,總所周知,庚子年(1900)八國聯軍入侵北京,1900末兩位數減去 11 得到的負值,然后補位+12得到1,即為:
(0-11+12)%12=1 對應的子,故1900為庚子年。而別的網站介紹,方法更是五花八門,各種情況下都有不同的算法,實在是太繁瑣,不便于計算
      我稍稍精簡了下算法,直接  (年份)%12 +9 = 年支  ,大于一輪地支數12的就減去12,此方法適用于20世紀、21世紀,還適用于18世紀,六十一甲子,就會循環一次,把1900往前推60年,即1840年(第一次鴉片戰爭)肯定也是庚子年,帶入公式 1840%12+9=13 結果大于12,然后減去12得1 ,所以1840年的年支為子。對于21世紀,帶入2017,同樣得到年支酉,經過大量測試,是沒有問題的,作為一個有追求的程序員,怎么會止步于此,于是,后臺程序就出來了
 
        protected void btnJudge_Click(object sender, EventArgs e)
        {
            //甲乙丙丁戊己庚辛壬癸   //子丑寅卯辰巳午未申酉戌亥
            string[] G = { "","","","","戊","","","","","" };
            string[] Z = { "","","","","","","","","","","","" };
           //獲取文本框值
            string year =txtYear.Text.Trim().ToString();
            string i = year.Substring(3,1);
            int Lasti = Convert.ToInt32(i);
            //計算年干
            Lasti =  Lasti > 3 ? Lasti - 3 : Lasti + 10 - 3;
            string YearG = G[Lasti-1];
            //計算年支
            int Lastz = Convert.ToInt32(year) % 12 + 9;
            Lastz = Lastz > 12 ? Lastz - 12 : Lastz;
            string YearZ = Z[Lastz-1];
            string All = YearG + YearZ;
            Response.Write("<script>alert('"+All+"')</script>");
            
        }

對于文本框輸入值合不合法,則是在前臺進行判斷

    <script type="text/javascript">
        $(function () {
            $("#btnJudge").click(function () {
                var num = /\d/;
                var Year = parseInt($("#txtYear").val());
                if (!num.test(Year)) {
                    alert("請輸入一個合法年份");
                    return false;
                }
                else if (Year < 999 || Year > 9999) {
                    alert("請輸入一個介於999~9999的年份");
                    return false;
                }
             
            })
        });
    </script>

對于月份的算法,這就比較復雜了,需要查詢月干表,如現在還是丙申猴年的臘月,那么查下表可得,月支為 辛丑 

然而在程序員的眼中,這只是一個二維數組而已,創建了此表,然后根據年干和月份來查詢月支即可,僅此而已。

關于這些皮毛,個人只是興趣愛好,中華文明,博大精深,而現代社會的高速發展,讓身邊的人都忙忙碌碌,或許是無暇顧及其它,讓人不由得想起了那句:子在川上曰,逝者如斯夫

 

文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()