zoukankan      html  css  js  c++  java
  • 【.net 深呼吸】获取日期的干支纪年

    其实,中国的农历是用干支纪年法的,“干支”即,十天干与十二地支。

    十天干为:甲、乙、丙、丁、戊、己、庚、辛、壬、癸。

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

    十天干的含义如下:

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

    乙—— 草木初长,即“轧”,此过程充满艰辛,如同被碾轧一般,此过程最能考验生命的坚韧程度。

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

    丁—— 阳光水分充沛,草木茁壮成长,就像一位健壮青年(人丁)。

    戊—— 积木成林,树木繁茂。

    己—— 即“纪”,指草木初现名状,可被辨识。

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

    辛—— 尝到收成的甘甜。

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

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

    十二地支的含义:

    子—— 道生一,一生二。

    丑—— 即“纽”,阴阳二气欲合未合之势。

    寅—— 三生万物,草木初长。

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

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

    巳—— 阴气含于阳气。草木生长态势良好,一片欣欣向荣的景象。即将到人生颠峰。

    午—— 事业有成,登上人生辉煌。

    未—— 即“味”,登上事业顶峰,尝到了功成名就滋味。

    申—— 顶盛。此时要小心,亢龙有悔,盛极之后将走向衰败,泰极否来。

    酉—— 老,步入老年,此时应该开始积淀人生。

    戌—— 即“灭”。死亡,一切归于虚无。

    亥—— 即“核”。新的种子即将发芽,开启新的生命。

    不管是十天干,还是十二地支,归结起来就是:生老病死。

    在 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 周年了。

    好了,今天的内容就到此完成了。示例代码请猛点击这里下载

  • 相关阅读:
    [转]Object Tracking using OpenCV (C++/Python)(使用OpenCV进行目标跟踪)
    [转]PIL、Pillow安装使用方法
    [转]痞子衡嵌入式:飞思卡尔Kinetis开发板OpenSDA调试器那些事(上)
    如何选择开源许可证?
    年复一年
    [转]TLD目标跟踪算法
    [转]pycharm中将ui文件转换成py文件
    ps矫正倾斜的扫描件内容
    ORM增删改查
    ORM配置
  • 原文地址:https://www.cnblogs.com/tcjiaan/p/7358753.html
Copyright © 2011-2022 走看看