網上已經有很多C#的農曆類,但看來都很複雜,其實C#中已經提供了中國的農曆類ChineseLunisolarCalendar。但未提供節氣和節日功能。
根據網上的方法位元組寫了一個中國農曆類!
ChinaDate.GetChinaDate(DateTime dt) 擷取農曆日期
ChinaDate.GetYear(DateTime dt) 擷取農曆年份(包含天干地支和生肖資訊)
ChinaDate.GetMonth(DateTime dt) 擷取農曆月份
ChinaDate.GetDay(DateTime dt) 擷取農曆日期
ChinaDate.GetSolarTerm(DateTime dt) 擷取節氣
ChinaDate.GetHoliday(DateTime dt) 擷取西曆節日
ChinaDate.GetChinaHoliday(DateTime dt) 擷取農曆節日
using System.Globalization;using System.Collections;using System;/// <summary>/// 中國農曆/// </summary>/// 日期:2011-01-13/// 作者:http://www.cnblogs.com/zjfree/public static class ChinaDate{private static ChineseLunisolarCalendar china = new ChineseLunisolarCalendar();private static Hashtable gHoliday = new Hashtable();private static Hashtable nHoliday = new Hashtable();private static string[] JQ = { "小寒", "大寒", "立春", "雨水", "驚蟄", "春分", "清明", "穀雨", "立夏", "小滿", "芒種", "夏至", "小暑", "大暑", "立秋", "處暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至" };private static int[] JQData = { 0, 21208, 43467, 63836, 85337, 107014, 128867, 150921, 173149, 195551, 218072, 240693, 263343, 285989, 308563, 331033, 353350, 375494, 397447, 419210, 440795, 462224, 483532, 504758 };static ChinaDate(){//西曆節日gHoliday.Add("0101", "元旦");gHoliday.Add("0214", "情人節");gHoliday.Add("0305", "雷鋒日");gHoliday.Add("0308", "婦女節");gHoliday.Add("0312", "植樹節");gHoliday.Add("0315", "消費者權益日");gHoliday.Add("0401", "愚人節");gHoliday.Add("0501", "勞動節");gHoliday.Add("0504", "青年節");gHoliday.Add("0601", "兒童節");gHoliday.Add("0701", "建黨節");gHoliday.Add("0801", "建軍節");gHoliday.Add("0910", "教師節");gHoliday.Add("1001", "國慶節");gHoliday.Add("1224", "平安夜");gHoliday.Add("1225", "聖誕節");//農曆節日nHoliday.Add("0101", "春節");nHoliday.Add("0115", "元宵節");nHoliday.Add("0505", "端午節");nHoliday.Add("0815", "中秋節");nHoliday.Add("0909", "重陽節");nHoliday.Add("1208", "臘八節");}/// <summary>/// 擷取農曆/// </summary>/// <param name="dt"></param>/// <returns></returns>public static string GetChinaDate(DateTime dt){if (dt > china.MaxSupportedDateTime || dt < china.MinSupportedDateTime){//日期範圍:1901 年 2 月 19 日 - 2101 年 1 月 28 日throw new Exception(string.Format("日期超出範圍!必須在{0}到{1}之間!", china.MinSupportedDateTime.ToString("yyyy-MM-dd"), china.MaxSupportedDateTime.ToString("yyyy-MM-dd")));}string str = string.Format("{0} {1}{2}", GetYear(dt), GetMonth(dt), GetDay(dt));string strJQ = GetSolarTerm(dt);if (strJQ != ""){str += " (" + strJQ + ")";}string strHoliday = GetHoliday(dt);if (strHoliday != ""){str += " " + strHoliday;}string strChinaHoliday = GetChinaHoliday(dt);if (strChinaHoliday != ""){str += " " + strChinaHoliday;}return str;}/// <summary>/// 擷取農曆年份/// </summary>/// <param name="dt"></param>/// <returns></returns>public static string GetYear(DateTime dt){int yearIndex = china.GetSexagenaryYear(dt);string yearTG = " 甲乙丙丁戊己庚辛壬癸";string yearDZ = " 子醜寅卯辰巳午未申酉戌亥";string yearSX = " 鼠牛虎兔龍蛇馬羊猴雞狗豬";int year = china.GetYear(dt);int yTG = china.GetCelestialStem(yearIndex);int yDZ = china.GetTerrestrialBranch(yearIndex);string str = string.Format("[{1}]{2}{3}{0}", year, yearSX[yDZ], yearTG[yTG], yearDZ[yDZ]);return str;}/// <summary>/// 擷取農曆月份/// </summary>/// <param name="dt"></param>/// <returns></returns>public static string GetMonth(DateTime dt){int year = china.GetYear(dt);int iMonth = china.GetMonth(dt);int leapMonth = china.GetLeapMonth(year);bool isLeapMonth = iMonth == leapMonth;if (leapMonth != 0 && iMonth >= leapMonth){iMonth--;}string szText = "正二三四五六七八九十";string strMonth = isLeapMonth ? "閏" : "";if (iMonth <= 10){strMonth += szText.Substring(iMonth - 1, 1);}else if (iMonth == 11){strMonth += "十一";}else{strMonth += "臘";}return strMonth + "月";}/// <summary>/// 擷取農曆日期/// </summary>/// <param name="dt"></param>/// <returns></returns>public static string GetDay(DateTime dt){int iDay = china.GetDayOfMonth(dt);string szText1 = "初十廿三";string szText2 = "一二三四五六七八九十";string strDay;if (iDay == 20){strDay = "二十";}else if (iDay == 30){strDay = "三十";}else{strDay = szText1.Substring((iDay - 1) / 10, 1);strDay = strDay + szText2.Substring((iDay - 1) % 10, 1);}return strDay;}/// <summary>/// 擷取節氣/// </summary>/// <param name="dt"></param>/// <returns></returns>public static string GetSolarTerm(DateTime dt){DateTime dtBase = new DateTime(1900, 1, 6, 2, 5, 0);DateTime dtNew;double num;int y;string strReturn = "";y = dt.Year;for (int i = 1; i <= 24; i++){num = 525948.76 * (y - 1900) + JQData[i - 1];dtNew = dtBase.AddMinutes(num);if (dtNew.DayOfYear == dt.DayOfYear){strReturn = JQ[i - 1];}}return strReturn;}/// <summary>/// 擷取西曆節日/// </summary>/// <param name="dt"></param>/// <returns></returns>public static string GetHoliday(DateTime dt){string strReturn = "";object g = gHoliday[dt.Month.ToString("00") + dt.Day.ToString("00")];if (g != null){strReturn = g.ToString();}return strReturn;}/// <summary>/// 擷取農曆節日/// </summary>/// <param name="dt"></param>/// <returns></returns>public static string GetChinaHoliday(DateTime dt){string strReturn = "";int year = china.GetYear(dt);int iMonth = china.GetMonth(dt);int leapMonth = china.GetLeapMonth(year);int iDay = china.GetDayOfMonth(dt);if (china.GetDayOfYear(dt) == china.GetDaysInYear(year)){strReturn = "除夕";}else if (leapMonth != iMonth){if (leapMonth != 0 && iMonth >= leapMonth){iMonth--;}object n = nHoliday[iMonth.ToString("00") + iDay.ToString("00")];if (n != null){if (strReturn == ""){strReturn = n.ToString();}else{strReturn += " " + n.ToString();}}}return strReturn;}}
類代碼下載:http://files.cnblogs.com/zjfree/ChinaDate.rar
修正記錄:
2012-04-10 擷取農曆月份是,閏月錯誤。感謝 tlptotop 提醒