【.net 深呼吸】擷取日期的幹支紀年

來源:互聯網
上載者:User

標籤:iso   style   艱辛   enum   file   應該   含義   glob   下一代   

其實,中國的農曆是用幹支紀年法的,“幹支”即,十天幹與十二地支。

十天幹為:甲、乙、丙、丁、戊、己、庚、辛、壬、癸。

十二地支為:子、醜、寅、卯、辰、巳、午、未、申、酉、戌、亥。

 

十天乾的含義如下:

甲—— 草木破土而出,萬物始生。

乙—— 草木初長,即“軋”,此過程充滿艱辛,如同被碾軋一般,此過程最能考驗生命的堅韌程度。

丙—— 即“炳”,草木得到充足陽光以成長。

丁—— 陽光水分充沛,草木茁壯成長,就像一位健壯青年(人丁)。

戊—— 積木成林,樹木繁茂。

己—— 即“紀”,指草木初現名狀,可被辨識。

庚—— 即“更”,更新,從此刻起草木將要繁衍下一代,生生不息。

辛—— 嘗到收成的甘甜。

壬—— 即“妊”,孕育後代。

癸—— 即“揆”。生生死死,死死生生,周而復始。

 

十二地支的含義:

子—— 道生一,一生二。

醜—— 即“紐”,陰陽二氣欲合未合之勢。

寅—— 三生萬物,草木初長。

卯—— 即“茂”,草木茂盛。

辰—— 即“震”。《易》經中的【震卦】,生命因萌動而生。

巳—— 陰氣含於陽氣。草木生長態勢良好,一片欣欣向榮的景象。即將到人生顛峰。

午—— 事業有成,登上人生輝煌。

未—— 即“味”,登上事業頂峰,嘗到了功成名就滋味。

申—— 頂盛。此時要小心,亢龍有悔,盛極之後將走向衰敗,泰極否來。

酉—— 老,步入老年,此時應該開始積澱人生。

戌—— 即“滅”。死亡,一切歸於虛無。

亥—— 即“核”。新的種子即將發芽,開啟新的生命。

 

不管是十天幹,還是十二地支,歸結起來就是:生老病死。

 

在 System.Globalization 命名空間下,提供了一個基於東方文化的日曆管理類 EastAsianLunisolarCalendar,它所派生出來的類型,可用於中國、日本、朝鮮等東方國家的日曆操作。

要獲得中國農曆相關的資訊,可以使用 ChineseLunisolarCalendar 類。調用 GetYear 方法可以擷取指定西曆日期的農曆年份,GetMonth 方法返回西曆日期中月份所對應的農曆月份。當然,你還可以用 IsLeapYear 或 IsLeapMonth 方法來判斷某年某月是否為閏年 / 閏月。

此處我們要擷取年份的幹支紀年值,可以調用 GetSexagenaryYear 方法,它返回 1 到 60 的值,表示在幹支紀年中的順序。前面老周講了十天乾和十二地支的內含。幹支記時法就是把十天乾和十二地支按順序組合起來使用。比如天幹中的甲,與地支中的子組合,為甲子;依此類推,乙丑,丙寅……

這樣組合下去,正好產生60對組合,即每60出現一個甲子,因此,每一個甲子年就是相隔六十年,然後不斷迴圈。

由於這些 API 所返回的都是數值,為了讓其表示為漢字,我們可以分別為天乾和地支聲明枚舉類型。

    enum 天幹    {        甲 = 1,        乙,        丙,        丁,        戊,        己,        庚,        辛,        壬,        癸    }    enum 地支    {        子 = 1,        醜,        寅,        卯,        辰,        巳,        午,        未,        申,        酉,        戌,        亥    }

只需要將每個枚舉中第一個成員標記為 1 即可,後面的它會自動增加,如乙為2,丙為3……

 

下面代碼示範如何擷取幹支紀年。

            ChineseLunisolarCalendar cncal = new ChineseLunisolarCalendar();            // 擷取農曆年份            int y = cncal.GetYear(seldate);            year.Text = y.ToString();            // 擷取幹支紀年值            int a = cncal.GetSexagenaryYear(seldate);            // 擷取天幹、地支            天幹 tg = (天幹)cncal.GetCelestialStem(a);            地支 dz = (地支)cncal.GetTerrestrialBranch(a);            string msg = $"{tg}{dz}";            ganzhi.Text = msg;

先用 GetSexagenaryYear 方法返回指定西曆年分的幹支紀年順序(1 - 60),把順序值存到變數 a 中,然後,用 GetCelestialStem 方法從幹支紀年中獲得天乾的順序(1 - 10),因為是整數值,所以可以強制轉換為我們上面定義的 天幹 枚舉。

同理,調用 GetTerrestrialBranch 方法,擷取到幹支紀年中地支的順序(1 - 12),可以強制轉換為 地支 枚舉的值。

 

然後,我們可以測試一下。

先用 2017 - 6 - 2 來測試,結果如下。

 

我們再用 2016 - 1 - 1 來測試,結果如下。

有夥伴會問,2016年不是丙申年嗎,是的,但是,看看農曆年份,它還是2015年,16年元旦時,農曆新年還未到。

我們可以把日期改為 2016 -7 - 1 ,再看看結果。

這時候就是丙申年了。

 

我們可以看看明年是什麼年。

明年可以紀念“戊戌變法” 120 周年了。

 

好了,今天的內容就到此完成了。範例程式碼請猛點擊這裡下載。

 

【.net 深呼吸】擷取日期的幹支紀年

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.