C#中将日期转换农历方法

在做一些数据统计或者时间方面的开发时,通常会遇到需要对时间的农历与阴历之间相互进行转化,需要查询当前日期是否为春节或其他节日,判断是否为春节期间“jrDate == "除夕" || jrDate == "春节" || jrSDate.Day < 7 && jrMonth == "正月"”,可以使用此工具类。

DateTime nDate = Convert.ToDateTime(date); //当前需要转换的日期

string jrDate = ChinaDate.GetChinaHoliday(nDate); //获取农历节日

string jrMonth = ChinaDate.GetMonth(nDate); //获取农历月份

string jrDay = ChinaDate.GetDay(nDate); //获取农历日期

DateTime jrSDate = ChinaDate.GetSunYearDate(nDate); //阳历转阳历

DateTime jrLDate = ChinaDate.GetLunarYearDate(jrSDate.AddYears(-1)); //阴历转阳历

///

/// 农历与阴历之间相互转化工具类

///

publicclassChinaDate

{

#region农历信息获取

private static ChineseLunisolarCalendar china=newChineseLunisolarCalendar();

privates tatic 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};

staticChinaDate()

{

//公历节日

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","腊八节");

}

///

/// 获取农历

///

public static string GetChinaDate(DateTimedt)

{

if(dt>china.MaxSupportedDateTime||dt

{

//日期范围: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")));

}

stringstr=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;

}

returnstr;

}

///

/// 获取农历年份

///

///

///

public static string GetYear(DateTimedt)

{

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;

}

///

/// 获取农历月份

///

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+"月";

}

///

/// 获取农历日期

///

///

///

public static stringGetDay(DateTimedt)

{

inti Day=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);

}

returnstrDay;

}

///

/// 获取节气

///

///

///

public static string GetSolarTerm(DateTimedt)

{

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;

}

///

/// 获取公历节日

///

///

///

public static string GetHoliday(DateTimedt)

{

string strReturn="";

object g=gHoliday[dt.Month.ToString("00")+dt.Day.ToString("00")];

if(g!=null)

{

strReturn=g.ToString();

}

return strReturn;

}

///

/// 获取农历节日

///

///

///

public static string GetChinaHoliday(DateTimedt)

{

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;

}

#endregion

#region阴历-阳历-转换

///

/// 阴历转为阳历

///

///指定的年份

public static DateTime GetLunarYearDate(DateTimedt)

{

int cnYear=china.GetYear(dt);

int cnMonth=china.GetMonth(dt);

int num1=0;

int num2=china.IsLeapYear(cnYear)?13:12;

while(num2>=cnMonth)

{

num1+=china.GetDaysInMonth(cnYear,num2--);

}

num1=num1-china.GetDayOfMonth(dt)+1;

return dt.AddDays(num1);

}

///

/// 阳历转为阴历

///

///公历日期

///农历的日期

public static DateTime GetSunYearDate(DateTimedt)

{

int year=china.GetYear(dt);

int iMonth=china.GetMonth(dt);

int iDay=china.GetDayOfMonth(dt);

int leapMonth=china.GetLeapMonth(year);

bool isLeapMonth=iMonth==leapMonth;

if(leapMonth!=0&&iMonth>=leapMonth)

{

iMonth--;

}

string str=string.Format("{0}-{1}-{2}",year,iMonth,iDay);

DateTime dtNew=DateTime.Now;

try

{

dtNew=Convert.ToDateTime(str);//防止出现2月份时,会出现超过时间,出现“2015-02-30”这种错误日期

}

catch

{

}

return dtNew;

}

#endregion

}

你可能感兴趣的:(C#中将日期转换农历方法)