阴阳历互相转换方法
#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);
}
總結
- 上一篇: 如何做一个漂亮的表格筛选电脑表格如何筛选
- 下一篇: Coding使用方法