C#实现农历日历的方法
本文实例讲述了C#实现农历日历的方法。分享给大家供大家参考。
具体实现方法如下:
//天干
private staticstring[]TianGan= {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
//地支
private staticstring[]DiZhi= {"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};
//十二生肖
private staticstring[]ShengXiao={"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"};
//农历日期
private staticstring[]DayName= {"*","初一","初二","初三","初四","初五","初六","初七","初八","初九","初十", "十一","十二","十三","十四","十五", "十六","十七","十八","十九","二十", "廿一","廿二","廿三","廿四","廿五", "廿六","廿七","廿八","廿九","三十"};
//农历月份
privatestaticstring[]MonthName= {"*","正","二","三","四","五","六","七","八","九","十","十一","腊"};
//公历月计数天
private staticint[]MonthAdd= {0,31,59,90,120,151,181,212,243,273,304,334};
//农历数据
privatestaticint[]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>
///<paramname="dtDay">公历日期</param>
///
///<returns></returns>
publicstringGetLunarCalendar(DateTimedtDay)
{
stringsYear=dtDay.Year.ToString();stringsMonth=dtDay.Month.ToString();
stringsDay=dtDay.Day.ToString();
intyear;
intmonth;
intday;
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;
}
intnTheDate;
intnIsEnd;
intk,m,n,nBit,i;
stringcalendar=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;elsek=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;
#region格式化日期显示为三月廿四 if(k==12) { if(month==LunarData[m]/65536+1) month=1-month; elseif(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()+"日";//// returncalendar;//// #endregion }