C# 公历转农历

/// <summary>

    /// LunDay 的摘要说明。

    /// 用法说明

    /// 直接调用即可,比较简单

    /// </summary>

    public class LunDay

    {

        public LunDay()

        {

            //

            // TODO: 在此处添加构造函数逻辑

            //

        }

        //天干

        private static string[] TianGan = { "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸" };

        //地支

        private static string[] DiZhi = { "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥" };

        //十二生肖

        private static string[] ShengXiao = { "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪" };

        //农历日期

        private static string[] DayName =   {"*","初一","初二","初三","初四","初五",

             "初六","初七","初八","初九","初十",

             "十一","十二","十三","十四","十五",

             "十六","十七","十八","十九","二十",

             "廿一","廿二","廿三","廿四","廿五",     

             "廿六","廿七","廿八","廿九","三十"};

        //农历月份

        private static string[] MonthName = { "*", "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊" };

        //公历月计数天

        private static int[] MonthAdd = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };

        //农历数据

        private static int[] LunarData = {2635,333387,1701,1748,267701,694,2391,133423,1175,396438

            ,3402,3749,331177,1453,694,201326,2350,465197,3221,3402

            ,400202,2901,1386,267611,605,2349,137515,2709,464533,1738

            ,2901,330421,1242,2651,199255,1323,529706,3733,1706,398762

            ,2741,1206,267438,2647,1318,204070,3477,461653,1386,2413

            ,330077,1197,2637,268877,3365,531109,2900,2922,398042,2395

            ,1179,267415,2635,661067,1701,1748,398772,2742,2391,330031

            ,1175,1611,200010,3749,527717,1452,2742,332397,2350,3222

            ,268949,3402,3493,133973,1386,464219,605,2349,334123,2709

            ,2890,267946,2773,592565,1210,2651,395863,1323,2707,265877};

        /// <summary>

        /// 获取对应日期的农历

        /// </summary>

        /// <param name="dtDay">公历日期</param>

        /// <returns></returns>

        public string GetLunarCalendar(DateTime dtDay)

        {

            string sYear = dtDay.Year.ToString();

            string sMonth = dtDay.Month.ToString();

            string sDay = dtDay.Day.ToString();

            int year;

            int month;

            int day;

            try

            {

                year = int.Parse(sYear);

                month = int.Parse(sMonth);

                day = int.Parse(sDay);

            }

            catch

            {

                year = DateTime.Now.Year;

                month = DateTime.Now.Month;

                day = DateTime.Now.Day;

            }

            int nTheDate;

            int nIsEnd;

            int k, m, n, nBit, i;

            string calendar = string.Empty;

            //计算到初始时间1921年2月8日的天数:1921-2-8(正月初一)

            nTheDate = (year - 1921) * 365 + (year - 1921) / 4 + day + MonthAdd[month - 1] - 38;

            if ((year % 4 == 0) && (month > 2))

                nTheDate += 1;

            //计算天干,地支,月,日

            nIsEnd = 0;

            m = 0;

            k = 0;

            n = 0;

            while (nIsEnd != 1)

            {

                if (LunarData[m] < 4095)

                    k = 11;

                else

                    k = 12;

                n = k;

                while (n >= 0)

                {

                    //获取LunarData[m]的第n个二进制位的值

                    nBit = LunarData[m];

                    for (i = 1; i < n + 1; i++)

                        nBit = nBit / 2;

                    nBit = nBit % 2;

                    if (nTheDate <= (29 + nBit))

                    {

                        nIsEnd = 1;

                        break;

                    }

                    nTheDate = nTheDate - 29 - nBit;

                    n = n - 1;

                }

                if (nIsEnd == 1)

                    break;

                m = m + 1;

            }

            year = 1921 + m;

            month = k - n + 1;

            day = nTheDate;

            //return year+"-"+month+"-"+day;

            #region 格式化日期显示为三月廿四

            if (k == 12)

            {

                if (month == LunarData[m] / 65536 + 1)

                    month = 1 - month;

                else if (month > LunarData[m] / 65536 + 1)

                    month = month - 1;

            }

            //生肖

            calendar = ShengXiao[(year - 4) % 60 % 12].ToString() + "年 ";

            //天干

            calendar += TianGan[(year - 4) % 60 % 10].ToString();

            //地支

            calendar += DiZhi[(year - 4) % 60 % 12].ToString() + " ";

            //农历月

            if (month < 1)

                calendar += "闰" + MonthName[-1 * month].ToString() + "月";

            else

                calendar += MonthName[month].ToString() + "月";

            //农历日

            calendar += DayName[day].ToString() + "日";

            return calendar;

            #endregion

        }

    }

时间: 2024-08-10 05:21:01

C# 公历转农历的相关文章

Andorid 之日历控件,可左右滑动,包含公历,农历,节假日等

公司项目需要日历这个功能,经过查阅资料写了个demo,包含公历,农历,节假日等,还可左右滑动. 效果图: 代码: public class MainActivity extends AppCompatActivity implements CalendarViewPagerFragment.OnPageChangeListener, CalendarViewFragment.OnDateClickListener, CalendarViewFragment.OnDateCancelListene

公历转农历的python实现

大杂烩.作为自己的记录,保存. 两个要点: 1.公历转农历用了查表法(第126行) 2.节气用了天文法?(第176行)  运行图 (背景是hao123万年历) 源代码: 1 # lunar.py 2 # 2015/02/27 罗兵 3 import datetime 4 5 class Lunar(object): 6 #****************************************************************************** 7 # 下面为阴历

java实现公历转农历代码

原文:java实现公历转农历代码 源代码下载地址:http://www.zuidaima.com/share/1565940224773120.htm 网上找的,用maven整理了一下.有junit测试代码,也可以直接运行main函数. 版权声明:本文为博主原创文章,未经博主允许不得转载.

公历和农历转换的JS代码&lt;转&gt;

<!-- function CalConv(M) { FIRSTYEAR = 1936; LASTYEAR = 2031; LunarCal = [ new tagLunarCal(23, 3, 2, 17, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0 ), /* 1936 */ new tagLunarCal( 41, 0, 4, 23, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1 ), new tagLunarCal( 30,

公历和农历转换的JS代码

<!-- function CalConv(M) { FIRSTYEAR = 1936; LASTYEAR = 2031; LunarCal = [ new tagLunarCal(23, 3, 2, 17, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0 ), /* 1936 */ new tagLunarCal( 41, 0, 4, 23, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1 ), new tagLunarCal( 30,

JS:公历、农历互转

先申明这段代码不是我写的,纯粹只是觉的比较好用,所以记录下来以后继续使用,也同样分享给大家,大家有更好的可以推荐给我,谢谢! function CalConv(M, dateStr) { if (dateStr == undefined) return false; var birthday = new Date(Date.parse(dateStr.replace(/-/, "/"))); //alert(birthday); var year = birthday.getFullY

公历和农历转换JS代码

<!-- function CalConv(M) { FIRSTYEAR = 1936; LASTYEAR = 2031; LunarCal = [ new tagLunarCal(23, 3, 2, 17, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0 ), /* 1936 */ new tagLunarCal( 41, 0, 4, 23, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1 ), new tagLunarCal( 30,

SQLServer公历转农历函数(1900年-2049年)

 ALTER   FUNCTION   [dbo].[f_SysGetLunar](      @solarDay   DATETIME)            RETURNS   varchar(200)  AS            BEGIN         DECLARE   @solData   int                DECLARE   @offset   int                DECLARE   @iLunar   int               

公历农历日期

Html代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>兼容ie9+</title> <link href="calendar.css" rel="stylesheet" type="text/css" /> <scri