17

分享一个自己写的取中国农历相关数据的类。包含:农历年月日,生肖,星座,年龄,天干...

 5 years ago
source link: http://www.cnblogs.com/mazhiyuan/p/10661053.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

分享一个自己写的取中国农历相关数据的类。包含:农历年月日,生肖,星座,年龄,天干,地支等方法。此类自己花了一上午的时间写的,适用于像相亲网等类似的网站

主要使用了微软针对东亚地区的农历类ChineseLunisolarCalendar

这些东西,网上其实有很多,我也参考了一下,但大多写的感觉拼凑的份儿多。也没有统一的这种规范类。

今天自己用到了,就顺便分享给大家,需要的人可以自行收藏。

贴代码吧:

/// <summary>
    /// 中国农历
    /// </summary>
    public class ChineseCalendar
    {
        /// <summary>
        /// 当前公历日期
        /// </summary>
        public DateTime DateTime { get; }

        /// <summary>
        /// 构造函数
        /// </summary>
        public ChineseCalendar() : this(DateTime.Now) { }

        private readonly ChineseLunisolarCalendar _chinseCaleander;
        private readonly int _sexagenaryYear;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="dateTime"></param>
        public ChineseCalendar(DateTime dateTime)
        {
            this.DateTime = dateTime;
            _chinseCaleander = new ChineseLunisolarCalendar();
            _sexagenaryYear = this._chinseCaleander.GetSexagenaryYear(this.DateTime) - 1;
        }

        /// <summary>
        /// 取天干
        /// </summary>
        /// <returns></returns>
        public virtual string GetTiangan()
        {
            var tiangans = new string[] { "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸" };
            return tiangans[_sexagenaryYear % 10];
        }

        /// <summary>
        /// 取地支
        /// </summary>
        /// <returns></returns>
        public virtual string GetDizhi()
        {
            var dizhis = new string[] { "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥" };
            return dizhis[_sexagenaryYear % 12];
        }

        /// <summary>
        /// 取农历年
        /// </summary>
        /// <returns></returns>
        public virtual int GetLunarYear()
        {
            return this._chinseCaleander.GetYear(this.DateTime);
        }

        /// <summary>
        /// 取农历月
        /// </summary>
        /// <returns></returns>
        public virtual int GetLunarMonth()
        {
            return this._chinseCaleander.GetMonth(this.DateTime);
        }

        /// <summary>
        /// 取农历日
        /// </summary>
        /// <returns></returns>
        public virtual int GetLunarDay()
        {
            return this._chinseCaleander.GetDayOfMonth(this.DateTime);
        }

        /// <summary>
        /// 取农历标准日期
        /// </summary>
        /// <returns></returns>
        public virtual DateTime GetLunarDate()
        {
            return new DateTime(this.GetLunarYear(), this.GetLunarMonth(), this.GetLunarDay());
        }

        /// <summary>
        /// 取农历月的规范化描述
        /// </summary>
        /// <returns></returns>
        public virtual string GetLunarMonthString()
        {
            int month = this.GetLunarMonth();
            var des = "";
            var names = new string[] { "*", "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊" };
            //农历月
            if (month < 1)
                des += "闰" + names[-1 * month].ToString() + "月";
            else
                des += names[month].ToString() + "月";

            return des;
        }

        /// <summary>
        /// 取农历日的规范化描述
        /// </summary>
        /// <returns></returns>
        public virtual string GetLunarDayString()
        {
            var names = new string[]{
                "*",
            "初一","初二","初三","初四","初五",
            "初六","初七","初八","初九","初十",
            "十一","十二","十三","十四","十五",
            "十六","十七","十八","十九","二十",
            "廿一","廿二","廿三","廿四","廿五",
            "廿六","廿七","廿八","廿九","三十"};

            int day = this.GetLunarDay();
            return names[day].ToString() + "日";
        }

        /// <summary>
        /// 取农历月日的规范化描述
        /// </summary>
        /// <returns></returns>
        public virtual string GetLunarMonthAndDayString()
        {
            return this.GetLunarMonthString() + this.GetLunarDayString();
        }

        /// <summary>
        /// 取中国农历年月日的规范化描述
        /// </summary>
        /// <returns></returns>
        public virtual string GetLunarChineseCalendar()
        {
            return string.Join(" ", this.GetZodiac() + "年", this.GetTiangan() + this.GetDizhi(), this.GetLunarMonthAndDayString());
        }

        /// <summary>
        /// 取生肖
        /// </summary>
        /// <returns></returns>
        public virtual string GetZodiac()
        {
            var zodiacs = new string[] { "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪" };
            return zodiacs[_sexagenaryYear % 12];
        }

        /// <summary>
        /// 取星座
        /// </summary>
        /// <returns></returns>
        public virtual string GetAtom()
        {
            var birthday = this.DateTime;
            float birthdayF = 0.00F;

            if (birthday.Month == 1 && birthday.Day < 20)
            {
                birthdayF = float.Parse(string.Format("13.{0}", birthday.Day.ToString("00")));
            }
            else
            {
                birthdayF = float.Parse(string.Format("{0}.{1}", birthday.Month, birthday.Day.ToString("00")));
            }

            //十二星座对应日期
            var atomBound = new float[] { 1.20F, 2.20F, 3.21F, 4.21F, 5.21F, 6.22F, 7.23F, 8.23F, 9.23F, 10.23F, 11.21F, 12.22F, 13.20F };
            //十二星座
            var atoms = new string[] { "水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", "天蝎座", "射手座", "魔羯座" };

            var atom = "";
            for (int i = 0; i < atomBound.Length - 1; i++)
            {
                if (atomBound[i] <= birthdayF && atomBound[i + 1] > birthdayF)
                {
                    atom = atoms[i];
                    break;
                }
            }

            return atom;
        }

        /// <summary>
        /// 取年龄
        /// </summary>
        /// <returns></returns>
        public virtual int GetAge()
        {
            int now = int.Parse(DateTime.Today.ToString("yyyyMMdd"));

            int dob = int.Parse(this.DateTime.ToString("yyyyMMdd"));

            string dif = (now - dob).ToString();

            string age = "0";

            if (dif.Length > 4)
                age = dif.Substring(0, dif.Length - 4);

            return Convert.ToInt32(age);
        }
    }

调用方式:

[Fact]
        public void Test1()
        {
            ChineseCalendar calendar = new ChineseCalendar(Convert.ToDateTime("2019-2-4"));
            var age = calendar.GetAge();
            var atom = calendar.GetAtom();
            var zodiac = calendar.GetZodiac();
            var dizhi = calendar.GetDizhi();
            var lunarChineseCalendar = calendar.GetLunarChineseCalendar();
            var lunarDay = calendar.GetLunarDay();
            var lunarDayString = calendar.GetLunarDayString();
            var lunarMonth = calendar.GetLunarMonth();
            var lunarMonthAndDayString = calendar.GetLunarMonthAndDayString();
            var lunarMonthString = calendar.GetLunarMonthString();
            var lunarYear = calendar.GetLunarYear();
            var tiangan = calendar.GetTiangan();
        }

调用结果,直接看图吧:

MnuM7rQ.png!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK