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

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

时间: 2024-10-08 22:32:09

【.net 深呼吸】获取日期的干支纪年的相关文章

Windows批处理中获取日期和时间

编写Windows批处理时经常会需要使用到日期和时间作为文件名,所以是非常重要的. 如何获取日期呢?格式:  %date%结果:  2012-07-31 如何获取时间呢?格式:  %time%结果:  10:21:21.68 这是获取的系统标准格式的日期和时间,但是有时候我们需要使用规定的格式,怎么办呢? 格式:   %date:~x,y%以及%time:~x,y%说明:   x是开始位置,y是取得字符数 比如说我要获取完整的日期和时间,格式:   %date:~0,4%%date:~5,2%%

实例365(6)---------DateTime.ToString格式化日期,使用DateDiff方法获取日期时间的间隔数

一:DateTime.ToString格式化日期,截图 二:代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace TmrFormat { public part

fortran_date_and_time:获取日期和时间

fortran求时间最详细函数data_and_time(2013-03-20 14:13:28)   分类: 吃饭的工具 1.4.7.1 date_and_time:获取日期和时间 这是一个 2000 年安全的 Fortran 95 内例程. 子例程 date_and_time 返回实时时钟和日期的相关数据.返回数据包括本地时间以及本地时间与通用协调时间 (Universal Coordinated Time, UTC) 之间的时差,通用协调时间也称为格林威治标准时间 (Greenwich M

Calendar类,获取日期

import java.util.*;import java.text.*;public class Text9{     public static void main(String args[]){          //创建Calendar对象          Calendar c=Calendar.getInstance();                   //获取时间          Date d=c.getTime();          System.out.printl

javascript获取日期,年,月,日

<!doctype html><html><head><meta charset="utf-8"><title>网页上的日期和天气</title></head> <body> <div style="float:right;margin-right:10px;display:inline;margin-top:38px;"> <div id=time&g

js获取日期年月日

var date = new Date(); date.getYear(); //获取当前年份(2位)date.getFullYear(); //获取完整的年份(4位,1970-????)date.getMonth(); //获取当前月份(0-11,0代表1月)date.getDate(); //获取当前日(1-31)date.getDay(); //获取当前星期X(0-6,0代表星期天)date.getTime(); //获取当前时间(从1970.1.1开始的毫秒数)date.getHours

JS获取日期yy-mm-dd格式

方法一: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 var myDate=new Date(); var month = myDate.getMonth() + 1; var Day = myDate.getDate(); var today = ""; if(month<10){ if(Day<10){ today = myDate.getFullYear() + "-0" + month + &qu

js获取日期

js获取日期: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div><span id="test">2017654165</span></div>

shell脚本中获取日期

数字时间转标准时间: 数字时间如:20151009163000 标准时间:2015-10-19 16:30:00 a=`head -1 /home/xxx/xxx/bin/.status |awk -F= '{print $2}'|sed -r 's/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/\1-\2-\3 \4:\5:\6/'` 把标准时间转换成秒(据1970-1-1): date -d "$a" +%