WindowsPhone 中 根据公历 获取农历日期数据

WindowsPhone 中 根据公历 获取农历日期数据

WindowsPhone 中 自定义 类,根据公历 获取农历日期数据

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ChineseCalendar
{
    /// <summary>
    /// 中国农历
    /// </summary>
    public static class ChineseDate
    {
        #region 日历数据
        /// <summary>
        /// int[] CalendarData
        /// </summary>
        static int[] CalendarData = new int[] {
                    0x41A95, 0xD4A, 0xDA5, 0x20B55, 0x56A, 0x7155B,
                    0x25D, 0x92D, 0x5192B, 0xA95, 0xB4A, 0x416AA, 0xAD5,
                    0x90AB5, 0x4BA, 0xA5B, 0x60A57, 0x52B, 0xA93, 0x40E95 };


        /// <summary>
        /// int[] madd
        /// </summary>
        static int[] madd = new int[] { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };


        static String numString = "一二三四五六七八九十";
        static String monString = "正二三四五六七八九十冬腊";
        static String[] run = new String[] { "闰正", "闰二", "闰三", "闰四", "闰五", "闰六", "闰七", "闰八", "闰九", "闰十", "闰冬", "闰腊" };
        static String cDateString = String.Empty;
        static int cYear, cMonth, cDay, cHour;
        static String holiday = String.Empty;
        #endregion


        #region 节日数据
        /// <summary>
        /// 农历节日数据
        /// </summary>
        static String[] NLHoliday = new String[] { 
                "正月初一 春节",
                "正月十五 元宵节",
                "二月初二 龙抬头",
                "五月初五 端午节",
                "七月初七 七夕",
                "七月十五 中元节",
                "八月十五 中秋节",
                "九月初九 重阳节",
                "腊月初八 腊八节",
                "腊月廿三 小年",
                "腊月三十 除夕"
        };


        //公历节日 表示放假日
        static String[] GLHoliday = new String[] {
                "0101 元旦",
                "0214 情人节",
                "0308 妇女节",
                "0312 植树节",
                "0401 愚人节",
                "0422 地球日",
                "0501 劳动节",
                "0504 青年节",
                "0531 无烟日",
                "0601 儿童节",
                "0606 爱眼日",
                "0701 建党日",
                "0707 抗战纪念日",
                "0801 建军节",
                "0910 教师节",
                "0918 九一八事变",
                "1001 国庆节",
                "1031 万圣节",
                "1111 光棍节",
                "1201 艾滋病日",
                "1213 南京大屠杀纪念日",
                "1224 平安夜",
                "1225 圣诞节"
        };
        #endregion


        #region 计算方法
        /// <summary>
        /// int GetBit
        /// </summary>
        /// <param name="m"></param>
        /// <param name="n"></param>
        /// <returns></returns>
        private static int GetBit(int m, int n)
        {
            return (m >> n) & 1;
        }




        /// <summary>
        /// void e2c
        /// </summary>
        /// <param name="dt">公历时间</param>
        private static void e2c(DateTime dt)
        {
            bool isEnd = false;
            int total, m, n, k, tmp = dt.Year;

            if (tmp < 1900) tmp += 1900;

            total = (tmp - 2001) * 365
                  + (int)Math.Floor((Double)(tmp - 2001) / 4)
                  + madd[dt.Month - 1]
                  + dt.Day
                  - 23;

            if (dt.Year % 4 == 0 && dt.Month > 2)
                total++;

            for (m = 0; ; m++)
            {
                k = (CalendarData[m] < 0xfff) ? 11 : 12;
                for (n = k; n >= 0; n--)
                {
                    if (total <= 29 + GetBit(CalendarData[m], n))
                    {
                        isEnd = true;
                        break;
                    }
                    total = total - 29 - GetBit(CalendarData[m], n);
                }
                if (isEnd) break;
            }


            cYear = 2001 + m;
            cMonth = k - n + 1;
            cDay = total;

            if (k == 12)
            {
                if (cMonth == (int)Math.Floor((double)(CalendarData[m] / 0x10000) + 1))
                    cMonth = 1 - cMonth;


                if (cMonth > (int)Math.Floor((double)(CalendarData[m] / 0x10000) + 1))
                    cMonth--;
            }
            cHour = (int)Math.Floor((double)((dt.Hour + 3) / 2));
        }


        /// <summary>
        /// void GetcDateString()
        /// </summary>
        private static void GetcDateString()
        {
            String tmp = String.Empty;

            if (cMonth < 1)
            {
                tmp += "闰";
                tmp += monString[-cMonth - 1];
            }
            else tmp += monString[cMonth - 1] + "月";

            if (cDay <= 10) tmp += "初";
            else if (cDay < 20) tmp += "十";
            else if (cDay == 20) tmp += "二十";
            else if (cDay < 30) tmp += "廿";
            else tmp += "三十";

            if (cDay % 10 != 0 || cDay == 10)
                tmp += numString[Math.Abs(cDay - 1) % 10];

            cDateString = tmp;
        }


        /// <summary>
        /// 获取对应日期的节日数据
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="strDate"></param>
        private static void getHoliday(DateTime dt, String strDate)
        {
            //获取农历节日
            String strNLHoliday = String.Empty;
            if (strDate == "正月")
                strNLHoliday = "春节";
            else
            {
                for (int i = 0, len = NLHoliday.Length; i < len; i++)
                {
                    if (NLHoliday[i].ToString().Contains(strDate))
                    {
                        strNLHoliday = NLHoliday[i].ToString().Split(' ')[1];
                        break;
                    }
                }
            }

            //获取公历节日
            String strGLHoliday = String.Empty;
            for (int i = 0, len = GLHoliday.Length; i < len; i++)
            {
                if (GLHoliday[i].ToString().Contains(dt.ToString("MMdd")))
                {
                    strGLHoliday = GLHoliday[i].ToString().Split(' ')[1];
                    break;
                }
            }

            //返回结果
            if (!String.IsNullOrEmpty(strNLHoliday) && !String.IsNullOrEmpty(strGLHoliday))
                holiday = (strNLHoliday + strGLHoliday).Replace("节", "");
            else if (!String.IsNullOrEmpty(strNLHoliday))
                holiday = strNLHoliday;
            else if (!String.IsNullOrEmpty(strGLHoliday))
                holiday = strGLHoliday;
            else holiday = String.Empty;
        }



        #region 农历年
        /// <summary>
        /// 十天干
        /// </summary>
        private static string[] tiangan = { "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸" };

        /// <summary>
        /// 十二地支
        /// </summary>
        private static string[] dizhi = { "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥" };


        /// <summary>
        /// 十二生肖
        /// </summary>
        private static string[] shengxiao = { "鼠", "牛", "虎", "免", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪" };

        /// <summary>
        /// 返回农历天干地支年 
        /// </summary>
        /// <param name="year">农历年</param>
        /// <returns></returns>
        private static string GetLunisolarYear(int year)
        {
            int tgIndex = (year - 1900 + 36) % 10;
            int dzIndex = (year - 1900 + 36) % 12;


            return string.Concat(tiangan[tgIndex], dizhi[dzIndex], "【", shengxiao[dzIndex], "】");
        }
        #endregion
        #endregion


        #region 调用方法
        /// <summary>
        /// 获取农历日期(格式 dd)
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static String getNLDate(DateTime dt)
        {
            e2c(dt);
            GetcDateString();

            //获取节日
            getHoliday(dt, cDateString);

            if (cDateString.Contains("初一"))
                cDateString = cDateString.Replace("初一", "");
            else
                cDateString = cDateString.Substring(cDateString.IndexOf("月") + 1);

            for (int i = 0, len = run.Length; i < len; i++)
            {
                if (cDateString.Contains(run[i]))
                {
                    cDateString = cDateString.Replace(run[i], "");
                    if (String.IsNullOrEmpty(cDateString))
                        cDateString = run[i];


                    break;
                }
            }

            return cDateString;
        }


        /// <summary>
        /// 获取农历日期(格式 年月日完整日期)
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static String getNLDateTime(DateTime dt)
        {
            //农历月
            getNLDate(dt);


            return GetLunisolarYear(dt.Year) + "年" + cDateString;
        }


        /// <summary>
        /// 获取节日数据
        /// </summary>
        /// <returns></returns>
        public static String getHoliday()
        {
            return holiday;
        }
        #endregion
    }
}


备注:此类 是更根据网上的 javascript 改编而来。

            经过测试,当输入的公历 年 小于 2001 年 获取的农历日期数据就会有误,

            并且 当 输入的年 大于 2040 年后 获取的农历数据也会有误!

          希望有人能够完善。谢谢!


效果图:

          

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追夢秋陽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值