#region 陰歷轉陽歷 /// <summary> /// 獲取指定年份春節當日(正月初一)的陽歷日期 /// </summary> /// <param name="year">指定的年份</param> private DateTime GetLunarNewYearDate(int year) { DateTime dt = new DateTime(year, 1, 1); int cnYear = calendar.GetYear(dt); int cnMonth = calendar.GetMonth(dt); int num1 = 0; int num2 = calendar.IsLeapYear(cnYear) ? 13 : 12; while (num2 >= cnMonth) { num1 += calendar.GetDaysInMonth(cnYear, num2--); } num1 = num1 - calendar.GetDayOfMonth(dt) + 1; return dt.AddDays(num1); } /// <summary> /// 陰歷轉陽歷 /// </summary> /// <param name="year">陰歷年</param> /// <param name="month">陰歷月</param> /// <param name="day">陰歷日</param> /// <param name="IsLeapMonth">是否閏月</param> public DateTime GetDateFromLunarDate(int year, int month, int day, bool IsLeapMonth) { if (year < 1902 || year > 2100) throw new Exception("只支持1902~2100期間的農歷年"); if (month < 1 || month > 12) throw new Exception("表示月份的數字必須在1~12之間"); if (day < 1 || day > calendar.GetDaysInMonth(year, month)) throw new Exception("農歷日期輸入有誤"); int num1 = 0, num2 = 0; int leapMonth = calendar.GetLeapMonth(year); if (((leapMonth == month + 1) && IsLeapMonth) || (leapMonth > 0 && leapMonth <= month)) num2 = month; else num2 = month - 1; while (num2 > 0) { num1 += calendar.GetDaysInMonth(year, num2--); } DateTime dt = GetLunarNewYearDate(year); return dt.AddDays(num1 + day - 1); } /// <summary> /// 陰歷轉陽歷 /// </summary> /// <param name="date">陰歷日期</param> /// <param name="IsLeapMonth">是否閏月</param> public DateTime GetDateFromLunarDate(DateTime date, bool IsLeapMonth) { return GetDateFromLunarDate(date.Year, date.Month, date.Day, IsLeapMonth); } #endregion #region 陽歷轉陰歷 public string SolarToChineseLunisolarDate(DateTime solarDateTime) { System.Globalization.ChineseLunisolarCalendar cal = new System.Globalization.ChineseLunisolarCalendar(); int year = cal.GetYear(solarDateTime); int month = cal.GetMonth(solarDateTime); int day = cal.GetDayOfMonth(solarDateTime); int leapMonth = cal.GetLeapMonth(year); return string.Format("農歷{0}{1}({2})年{3}{4}月{5}{6}" , "甲乙丙丁戊己庚辛壬癸"[(year - 4) % 10] , "子丑寅卯辰巳午未申酉戌亥"[(year - 4) % 12] , "鼠牛虎兔龍蛇馬羊猴雞狗豬"[(year - 4) % 12] , month == leapMonth ? "閏" : "" , "無正二三四五六七八九十冬臘"[leapMonth > 0 && leapMonth <= month ? month - 1 : month] , "初十廿三"[day / 10] , "日一二三四五六七八九"[day % 10] ); } #endregion
陽歷轉陰歷
#region 陽歷轉陰歷 public string SolarToChineseLunisolarDate(DateTime solarDateTime) { System.Globalization.ChineseLunisolarCalendar cal = new System.Globalization.ChineseLunisolarCalendar(); int year = cal.GetYear(solarDateTime); int month = cal.GetMonth(solarDateTime); int day = cal.GetDayOfMonth(solarDateTime); int leapMonth = cal.GetLeapMonth(year); return string.Format("農歷{0}{1}({2})年{3}{4}月{5}{6}" , "甲乙丙丁戊己庚辛壬癸"[(year - 4) % 10] , "子丑寅卯辰巳午未申酉戌亥"[(year - 4) % 12] , "鼠牛虎兔龍蛇馬羊猴雞狗豬"[(year - 4) % 12] , month == leapMonth ? "閏" : "" , "無正二三四五六七八九十冬臘"[leapMonth > 0 && leapMonth <= month ? month - 1 : month] , "初十廿三"[day / 10] , "日一二三四五六七八九"[day % 10] ); } #endregion
調用方法:
//陰歷轉陽歷 public void GetDayFromLunarDate(DateTime time) { ChineseCalendar cc = new ChineseCalendar(time); cc.GetDateFromLunarDate(time, true); } //陽歷轉陰歷 public void GetLunarDateFromDay(DateTime time) { ChineseCalendar cc = new ChineseCalendar(time); string LunarDate = cc.SolarToChineseLunisolarDate(time); }