⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calenderconverter.cs

📁 嵌入式开发从基础到提高
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.Text;

namespace CalendarConverter
{
    class CalendarConverter
    {  
        //农历压缩数据,从1949~2010的压缩数据
        //从1~12位为每月的大小月信息,大月为1,小月为0
        //13为闰月的大小月,闰月为大月则1,为小月则0
        //14~15位为闰月的月份
        //16~19位为当年农历正月初一时公历的日期,若当年2月15日为农历
        //正月初一,则16~19位为0215
        static string[] strChineseCalendarData = 

        {
                "1011010010101070129",//1949    [00]
                "0110110010100000217",//        [01]
                "1011010101010000206",
                "0101010110101050127",
                "0100110110100000214",
                "1010010110110000203",
                "0101001010111030124",
                "0101001010110000212",
                "1010100101010080131",
                "1110100101010000218",
                "0110101010100000208",//1959    [10]
                "1010111101010060128",//第七位原为0,1960年9月20日
                "1010101101010000215",
                "0100101101100000205",
                "1010010101110040125",
                "1010010101110000213",
                "0101001001100000202",
                "1110100100110030121",
                "1101100101010000209",
                "0101101010101070130",
                "0101011010100000217",//1969    [20]
                "1001011011010000206",
                "0100101011101050127",
                "0100101011010000215",
                "1010010011010000203",
                "1101001001101040123",
                "1101001001010000211",
                "1101010100101080131",
                "1011010101000000218",
                "1011011010100000207",
                "1001011011010060128",//1979    [30]
                "1001010110110000216",//1980,计算参考年
                "0100100110110000205",
                "1010010010111040125",
                "1010010010110000213",
                "1011001001011100202",
                "0110101001010000220",
                "0110110101000000209",
                "1010110110101060129",
                "1010101101100000217",
                "1001001101110000206",//1989    [40]
                "0100100101111050127",
                "0100100101110000215",
                "0110010010110000204",
                "0110101001010030123",
                "1110101001010000210",
                "0110101100101080131",
                "0101101011000000219",
                "1010101101100000207",
                "1001001101101050128",
                "1001001011100000216",//1999    [50]
                "1100100101100000205",
                "1101010010101040124",
                "1101010010100000212",
                "1101101001010000201",
                "0101101010101020122",
                "0101011010100000209",
                "1010101011011070129",
                "0010010111010000218",
                "1001001011010000207",
                "1100100101011050126",//2009    [60]
                "1010100101010000214" //        [61]
        };
        //十二生肖
        static string[] strAnimalSign = 
        {
                "Mouse",
                "Ox",
                "Tiger",
                "Rabbit",
                "Loong",
                "Snake",
                "Horse",
                "Sheep",
                "Monkey",
                "Chicken",
                "Dog",
                "Pig"
        };
        //农历每天的拼音
        static string[] strChinexeCalendarDay =
        {
                "Chu Yi",
                "Chu Er",
                "Chu San",
                "Chu Si",
                "Chu Wu",
                "Chu Liu",
                "Chu Qi",
                "Chu Ba",
                "Chu Jiu",
                "Chu Shi",
                "Shi Yi",
                "Shi Er",
                "Shi San",
                "Shi Si",
                "Shi Wu",
                "Shi Liu",
                "Shi Qi",
                "Shi Ba",
                "Shi Jiu",
                "Er Shi",
                "Er Shi Yi",
                "Er Shi Er",
                "Er Shi San",
                "Er Shi Si",
                "Er Shi Wu",
                "Er Shi Liu",
                "Er Shi Qi",
                "Er Shi Ba",
                "Er Shi Jiu",
                "San Shi"
        };
        //农历每月的拼音
        static string[] strChineseCalendarMonth = 
        {
                "Zheng Yue",
                "Er Yue",
                "San Yue",
                "Si Yue",
                "Wu Yue",
                "Liu Yue",
                "Qi Yue",
                "Ba Yue",
                "Jiu Yue",
                "Shi Yue",
                "Dong Yue",
                "La Yue"
        };
        //六十甲子
        static string[] strGanZhi = 
        {
                "Jia Zi",//   [00]
                "Yi Chou",
                "Bing Yin",
                "Ding Mao",
                "Wu Chen",
                "Ji Si",
                "Geng Wu",
                "Xin Mo",
                "Ren Shen",
                "Gui You",
                "Jia Xu",
                "Yi Hai",
                "Bing Zi",
                "Ding Chou",
                "Wu Yin",
                "Ji Mao",
                "Geng Chen",
                "Xin Si",
                "Ren Wu",
                "Gui Mo",
                "Jia Shen",
                "Yi You",
                "Bing Xu",
                "Ding Hai",
                "Wu Zi",
                "Ji Chou",
                "Geng Yin",
                "Xin Mao",
                "Ren Chen",
                "Gui Si",
                "Jia Wu",
                "Yi Mo",
                "Bing Shen",
                "Ding You",
                "Wu Xu",
                "Ji Hai",
                "Geng Zi",
                "Xin Chou",
                "Ren Yin",
                "Gui Mao",
                "Jia Chen",
                "Yi Si",
                "Bing Wu",
                "Ding Mo",
                "Wu Shen",
                "Ji You",
                "Geng Xu",
                "Xin Hai",
                "Ren Zi",
                "Gui Chou",
                "Jia Yin",
                "Yi Mao",
                "Bing Chen",
                "Ding Si",
                "Wu Wu",
                "Ji Mo",
                "Geng Shen",//1980年的干支   [56]
                "Xin You",
                "Ren Xu",
                "Gui Hai"
        };
        //能转换的最大年限
        static int intMaxYear = 2010;
        //能转换的最小年限
        static int intMinYear = 1950;
        //检查输入的公历是否合法
        public static int IsDateRight(int intYear, int intMonth, int intDay)
        {
            //如果是1、3、5、7、8、10、12月,则每月日期必须在1~31之间
            if (intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 || intMonth == 10 || intMonth == 12)
            {
                if (intDay >= 1 && intDay <= 31)
                {
                    return 1;
                }
            }
            //如果为二月,闰年中日期必须在1~29天之间
            //非闰年日期必须在1~28天之间
            if (intMonth == 2)
            {
                //当年数符合以下两个条件之一时,判定其为闰年
                //1、能被四整除但不能被100整除
                //2、能被四百整除
                //闰年的二月的日期不必须在1~29天之间
                if ((intYear % 4 == 0 && intYear % 100 != 0) || intYear % 400 == 0)
                {
                    if (intDay >= 1 && intDay <= 29)
                    {
                        return 1;
                    }
                }
                //在非闰年里,二月的日期不能超过28天
                else if (intDay >= 1 && intDay <= 28)
                {
                    return 1;
                }
            }
            //如果是4、6、9、11月,则每月日期必须在1~30天之间
            if (intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11)
            {
                if (intDay >= 1 && intDay <= 30)
                {
                    return 1;
                }
            }
            return 0;
        }
        //将公历日期转换成农历日期
        public static string ConvertChineseToGregorian(int intInputGregYear, int intInputGregMonth, int intInputGregDay)
        {
            //检查输入的日期是否在系统转换的日期范围之内
            if (intInputGregYear > intMaxYear || intInputGregYear < intMinYear)
            {
                return "The date you input Out of the Convert Range.";
            }
            //调用IsDateRight来对输入的日期进行合法性检查,
            if (IsDateRight(intInputGregYear,intInputGregMonth,intInputGregDay) == 0)
            {
                return "The date you input is illage!";
            }
            //存储农历的年份,初始值取与公历相同的年数
            int intCalcChYear = intInputGregYear;
            //存储农历的当年的正月初一时的公历月数
            int intCalcChMonth = Convert.ToInt32(strChineseCalendarData[intCalcChYear - intMinYear + 1].Substring(15,2));
            //存储农历的当年的正月初一时的公历号数
            int intCalcChDay = Convert.ToInt32(strChineseCalendarData[intCalcChYear - intMinYear + 1].Substring(17,2));
            //检查需要转换的公历日期和正月初一时的公历日期的早晚
            //如果前者比后者要早,则将农历年份减一,并重新把相应
            //的农历正月初一的公历日期存储到intCalcChMonth和
            //intCalcChDay中
            if (intInputGregMonth < intCalcChMonth || (intInputGregMonth == intCalcChMonth && intInputGregDay < intCalcChDay))
            {
                intCalcChDay = intCalcChDay - 1;
                intCalcChMonth = Convert.ToInt32(strChineseCalendarData[intCalcChYear - intMinYear + 1].Substring(15,2));
                intCalcChDay = Convert.ToInt32(strChineseCalendarData[intCalcChYear - intMinYear + 1].Substring(17,2));
            }
            //计算需要转换的公历和农历正月初一之间相应的天数
            DateTime dtInput = new DateTime(intInputGregYear,intInputGregMonth,intInputGregDay);
            DateTime dt = new DateTime(intCalcChYear, intCalcChMonth, intCalcChDay);
            TimeSpan ts = dtInput - dt;
            //把相关的天数存储到intTimeSpan这个整型值中
            int intTimeSpan = ts.Days;
            //将农历日期值置为正月初一这个农历日期
            intCalcChDay = 1;
            intCalcChMonth = 1;
            //将农历当年的年份数据存储到strThisYear这个字符串中
            string strThisYear = strChineseCalendarData[intCalcChYear - intMinYear + 1];
            //置闰年标志,其为0表示为平年,其为1表示为闰年
            int intIsLeapYear = 0;
            //开始循环,循环的界限是输入的公历日期与农历正月初一之间相隔的天数
            for (int i = 0; i < intTimeSpan; i++)
            {
                //先将日子加一
                intCalcChDay ++;
                //当日子的值在小月达到30或者大月达到31时,把月份递加一
                if (intCalcChDay == 30 + Convert.ToInt32(strThisYear.Substring(intCalcChMonth - 1, 1)) || intIsLeapYear == 1 && (intCalcChDay == 30 + Convert.ToInt32(strThisYear.Substring(12, 1))))
                {
                    //处理闰月时的情况
                    if (intIsLeapYear == 0 && (intCalcChMonth == Convert.ToInt32(strThisYear.Substring(13, 2))))
                    {
                        intIsLeapYear = 1;
                    }
                    else
                    {
                        intIsLeapYear = 0;
                        intCalcChMonth++;
                    }
                    intCalcChDay = 1;
                }
            }
            //将月份数转变为汉语拼音
            string strCalcChMonth = strChineseCalendarMonth[intCalcChMonth - 1];
            //如果是闰月,还要在月份前加个“闰”字
            if (intIsLeapYear == 1)
            {
                strCalcChMonth = "Run " + strCalcChMonth;
            }
            //根据输入的公历日期,求出当天的星期日子
            string strWeekDay = Convert.ToString(dtInput.DayOfWeek);
            //计算相应的过干支
            string strCalcChGanZhi = strGanZhi[(intCalcChYear - 4) % 60];
            //计算相应的生肖
            string strCalcChAnimalSign = strAnimalSign[(intCalcChYear - 4) % 12];
            //将日子转换变成为汉语拼音
            string strCalcChDay = strChinexeCalendarDay[intCalcChDay - 1];
            //返回一个完整的表现农历的字符串
            return intCalcChYear + " . " + intCalcChMonth + " . " + intCalcChDay + "\n" + strCalcChAnimalSign + "\n" + strCalcChGanZhi + " . " + strCalcChMonth + " . " + strCalcChDay + "\n" + strWeekDay;
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -