C通用节气类库农历类(很全面)
自己整理的,专业分享学习高质量代码,每周期布置学习任务,激发学习C兴趣!
用法:
DateTimedtmc。SelectionStart;
cnewEcanChineseCalendar(dt);
StringBuilderdayInfonewStringBuilder();
dayInfo。Append(阳历:c。DateStringr);阳历日期
dayInfo。Append(农历:c。ChineseDateStringr);农历日期
dayInfo。Append(星期:c。WeekDayStr);星期
dayInfo。Append(时辰:c。ChineseHourr);时辰
dayInfo。Append(属相:c。AnimalStringr);属相
dayInfo。Append(节气:c。ChineseTwentyFourDayr);节气
dayInfo。Append(前一个节气:c。ChineseTwentyFourPrevDayr);前一个节气
dayInfo。Append(下一个节气:c。ChineseTwentyFourNextDayr);下一个节气
dayInfo。Append(节日:c。DateHolidayr);节日
dayInfo。Append(干支:c。GanZhiDateStringr);干支
dayInfo。Append(星宿:c。ChineseConstellationr);星宿
dayInfo。Append(星座:c。Constellationr);星座
usingSystem;
usingSystem。Collections。Generic;
usingSystem。Text;
namespaceAH。BI。MWeb。Service
{
regionChineseCalendarException
中国日历异常处理
publicclassnewCalendarException:System。Exception
{
publicnewCalendarException(stringmsg)
:base(msg)
{
}
}
endregion
publicclassEcanChineseCalendar
{
region内部结构
privatestructSolarHolidayStruct阳历
{
publicintMonth;
publicintDay;
publicintRecess;假期长度
publicstringHolidayName;
publicSolarHolidayStruct(intmonth,intday,intrecess,stringname)
{
Monthmonth;
Dayday;
Recessrecess;
HolidayNamename;
}
}
privatestructLunarHolidayStruct农历
{
publicintMonth;
publicintDay;
publicintRecess;
publicstringHolidayName;
publicLunarHolidayStruct(intmonth,intday,intrecess,stringname)
{
Monthmonth;
Dayday;
Recessrecess;
HolidayNamename;
}
}
privatestructWeekHolidayStruct
{
publicintMonth;
publicintWeekAtMonth;
publicintWeekDay;
publicstringHolidayName;
publicWeekHolidayStruct(intmonth,intweekAtMonth,intweekDay,stringname)
{
Monthmonth;
WeekAtMonthweekAtMonth;
WeekDayweekDay;
HolidayNamename;
}
}
endregion
region内部变量
privateDateTimedate;
privateDateTimedatetime;
privateintcYear;
privateintcMonth;
privateintcDay;
privateboolcIsLeapMonth;当月是否闰月
privateboolcIsLeapYear;当年是否有闰月
endregion
region基础数据
region基本常量
privateconstintMinYear1900;
privateconstintMaxYear2050;
privatestaticDateTimeMinDaynewDateTime(1900,1,30);
privatestaticDateTimeMaxDaynewDateTime(2049,12,31);
privateconstintGanZhiStartYear1864;干支计算起始年
privatestaticDateTimeGanZhiStartDaynewDateTime(1899,12,22);起始日
privateconststringHZNum零一二三四五六七八九;
privateconstintAnimalStartYear1900;1900年为鼠年
privatestaticDateTimeChineseConstellationReferDaynewDateTime(2007,9,13);28星宿参考值,本期为角
endregion
region阴历数据
来源于网上的农历数据
数据结构如下,共使用17位数据
第17位:表示闰月天数,0表示29天1表示30天
第16位第5位(共12位)表示12个月,其中第16位表示第一月,如果该月为30天则为1,29天为0
第4位第1位(共4位)表示闰月是哪个月,如果当年没有闰月,则置0
privatestaticint〔〕LunarDateArraynewint〔〕{
0x04BD8,0x04AE0,0x0A570,0x054D5,0x0D260,0x0D950,0x16554,0x056A0,0x09AD0,0x055D2,
0x04AE0,0x0A5B6,0x0A4D0,0x0D250,0x1D255,0x0B540,0x0D6A0,0x0ADA2,0x095B0,0x14977,
0x04970,0x0A4B0,0x0B4B5,0x06A50,0x06D40,0x1AB54,0x02B60,0x09570,0x052F2,0x04970,
0x06566,0x0D4A0,0x0EA50,0x06E95,0x05AD0,0x02B60,0x186E3,0x092E0,0x1C8D7,0x0C950,
0x0D4A0,0x1D8A6,0x0B550,0x056A0,0x1A5B4,0x025D0,0x092D0,0x0D2B2,0x0A950,0x0B557,
0x06CA0,0x0B550,0x15355,0x04DA0,0x0A5B0,0x14573,0x052B0,0x0A9A8,0x0E950,0x06AA0,
0x0AEA6,0x0AB50,0x04B60,0x0AAE4,0x0A570,0x05260,0x0F263,0x0D950,0x05B57,0x056A0,
0x096D0,0x04DD5,0x04AD0,0x0A4D0,0x0D4D4,0x0D250,0x0D558,0x0B540,0x0B6A0,0x195A6,
0x095B0,0x049B0,0x0A974,0x0A4B0,0x0B27A,0x06A50,0x06D40,0x0AF46,0x0AB60,0x09570,
0x04AF5,0x04970,0x064B0,0x074A3,0x0EA50,0x06B58,0x055C0,0x0AB60,0x096D5,0x092E0,
0x0C960,0x0D954,0x0D4A0,0x0DA50,0x07552,0x056A0,0x0ABB7,0x025D0,0x092D0,0x0CAB5,
0x0A950,0x0B4A0,0x0BAA4,0x0AD50,0x055D9,0x04BA0,0x0A5B0,0x15176,0x052B0,0x0A930,
0x07954,0x06AA0,0x0AD50,0x05B52,0x04B60,0x0A6E6,0x0A4E0,0x0D260,0x0EA65,0x0D530,
0x05AA0,0x076A3,0x096D0,0x04BD7,0x04AD0,0x0A4D0,0x1D0B6,0x0D250,0x0D520,0x0DD45,
0x0B5A0,0x056D0,0x055B2,0x049B0,0x0A577,0x0A4B0,0x0AA50,0x1B255,0x06D20,0x0ADA0,
0x14B63
};
endregion
region星座名称
privatestaticstring〔〕constellationName
{
白羊座,金牛座,双子座,
巨蟹座,狮子座,处女座,
天秤座,天蝎座,射手座,
摩羯座,水瓶座,双鱼座
};
endregion
region二十四节气
privatestaticstring〔〕lunarHolidayName
{
小寒,大寒,立春,雨水,
惊蛰,春分,清明,谷雨,
立夏,小满,芒种,夏至,
小暑,大暑,立秋,处暑,
白露,秋分,寒露,霜降,
立冬,小雪,大雪,冬至
};
endregion
region二十八星宿
privatestaticstring〔〕chineseConstellationName
{
四五六日一二三
角木蛟,亢金龙,女土蝠,房日兔,心月狐,尾火虎,箕水豹,
斗木獬,牛金牛,氐土貉,虚日鼠,危月燕,室火猪,壁水獝,
奎木狼,娄金狗,胃土彘,昴日鸡,毕月乌,觜火猴,参水猿,
井木犴,鬼金羊,柳土獐,星日马,张月鹿,翼火蛇,猎水蚓
};
endregion
region节气数据
privatestaticstring〔〕SolarTermnewstring〔〕{小寒,大寒,立春,雨水,惊蛰,春分,清明,谷雨,立夏,小满,芒种,夏至,小暑,大暑,立秋,处暑,白露,秋分,寒露,霜降,立冬,小雪,大雪,冬至};
privatestaticint〔〕sTermInfonewint〔〕{0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,240693,263343,285989,308563,331033,353350,375494,397447,419210,440795,462224,483532,504758};
endregion
region农历相关数据
privatestaticstringganStr甲乙丙丁戊己庚辛壬癸;
privatestaticstringzhiStr子丑寅卯辰巳午未申酉戌亥;
privatestaticstringanimalStr鼠牛虎兔龙蛇马羊猴鸡狗猪;
privatestaticstringnStr1日一二三四五六七八九;
privatestaticstringnStr2初十廿卅;
privatestaticstring〔〕monthString
{
出错,正月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,腊月
};
endregion
region按公历计算的节日
privatestaticSolarHolidayStruct〔〕sHolidayInfonewSolarHolidayStruct〔〕{
newSolarHolidayStruct(1,1,1,元旦),
newSolarHolidayStruct(2,2,0,世界湿地日),
newSolarHolidayStruct(2,10,0,国际气象节),
newSolarHolidayStruct(2,14,0,情人节),
newSolarHolidayStruct(3,1,0,国际海豹日),
newSolarHolidayStruct(3,5,0,学雷锋纪念日),
newSolarHolidayStruct(3,8,0,妇女节),
newSolarHolidayStruct(3,12,0,植树节孙中山逝世纪念日),
newSolarHolidayStruct(3,14,0,国际警察日),
newSolarHolidayStruct(3,15,0,消费者权益日),
newSolarHolidayStruct(3,17,0,中国国医节国际航海日),
newSolarHolidayStruct(3,21,0,世界森林日消除种族歧视国际日世界儿歌日),
newSolarHolidayStruct(3,22,0,世界水日),
newSolarHolidayStruct(3,24,0,世界防治结核病日),
newSolarHolidayStruct(4,1,0,愚人节),
newSolarHolidayStruct(4,7,0,世界卫生日),
newSolarHolidayStruct(4,22,0,世界地球日),
newSolarHolidayStruct(5,1,1,劳动节),
newSolarHolidayStruct(5,2,1,劳动节假日),
newSolarHolidayStruct(5,3,1,劳动节假日),
newSolarHolidayStruct(5,4,0,青年节),
newSolarHolidayStruct(5,8,0,世界红十字日),
newSolarHolidayStruct(5,12,0,国际护士节),
newSolarHolidayStruct(5,31,0,世界无烟日),
newSolarHolidayStruct(6,1,0,国际儿童节),
newSolarHolidayStruct(6,5,0,世界环境保护日),
newSolarHolidayStruct(6,26,0,国际禁毒日),
newSolarHolidayStruct(7,1,0,建党节香港回归纪念世界建筑日),
newSolarHolidayStruct(7,11,0,世界人口日),
newSolarHolidayStruct(8,1,0,建军节),
newSolarHolidayStruct(8,8,0,中国男子节父亲节),
newSolarHolidayStruct(8,15,0,抗日战争胜利纪念),
newSolarHolidayStruct(9,9,0,毛主席逝世纪念),
newSolarHolidayStruct(9,10,0,教师节),
newSolarHolidayStruct(9,18,0,九一八事变纪念日),
newSolarHolidayStruct(9,20,0,国际爱牙日),
newSolarHolidayStruct(9,27,0,世界旅游日),
newSolarHolidayStruct(9,28,0,孔子诞辰),
newSolarHolidayStruct(10,1,1,国庆节国际音乐日),
newSolarHolidayStruct(10,2,1,国庆节假日),
newSolarHolidayStruct(10,3,1,国庆节假日),
newSolarHolidayStruct(10,6,0,老人节),
newSolarHolidayStruct(10,24,0,联合国日),
newSolarHolidayStruct(11,10,0,世界青年节),
newSolarHolidayStruct(11,12,0,孙中山诞辰纪念),
newSolarHolidayStruct(12,1,0,世界艾滋病日),
newSolarHolidayStruct(12,3,0,世界残疾人日),
newSolarHolidayStruct(12,20,0,澳门回归纪念),
newSolarHolidayStruct(12,24,0,平安夜),
newSolarHolidayStruct(12,25,0,圣诞节),
newSolarHolidayStruct(12,26,0,毛主席诞辰纪念)
};
endregion
region按农历计算的节日
privatestaticLunarHolidayStruct〔〕lHolidayInfonewLunarHolidayStruct〔〕{
newLunarHolidayStruct(1,1,1,春节),
newLunarHolidayStruct(1,15,0,元宵节),
newLunarHolidayStruct(5,5,0,端午节),
newLunarHolidayStruct(7,7,0,七夕情人节),
newLunarHolidayStruct(7,15,0,中元节盂兰盆节),
newLunarHolidayStruct(8,15,0,中秋节),
newLunarHolidayStruct(9,9,0,重阳节),
newLunarHolidayStruct(12,8,0,腊八节),
newLunarHolidayStruct(12,23,0,北方小年(扫房)),
newLunarHolidayStruct(12,24,0,南方小年(掸尘)),
newLunarHolidayStruct(12,30,0,除夕)注意除夕需要其它方法进行计算
};
endregion
region按某月第几个星期几
privatestaticWeekHolidayStruct〔〕wHolidayInfonewWeekHolidayStruct〔〕{
newWeekHolidayStruct(5,2,1,母亲节),
newWeekHolidayStruct(5,3,1,全国助残日),
newWeekHolidayStruct(6,3,1,父亲节),
newWeekHolidayStruct(9,3,3,国际和平日),
newWeekHolidayStruct(9,4,1,国际聋人节),
newWeekHolidayStruct(10,1,2,国际住房日),
newWeekHolidayStruct(10,1,4,国际减轻自然灾害日),
newWeekHolidayStruct(11,4,5,感恩节)
};
endregion
endregion
region构造函数
regionChinaCalendar公历日期初始化
用一个标准的公历日期来初使化
param
publicEcanChineseCalendar(DateTimedt)
{
inti;
intleap;
inttemp;
intoffset;
CheckDateLimit(dt);
datedt。Date;
datetimedt;
农历日期计算部分
leap0;
temp0;
TimeSpantsdateEcanChineseCalendar。MinDay;计算两天的基本差距
offsetts。Days;
for(iMinYear;iMaxYear;i)
{
tempGetChineseYearDays(i);求当年农历年天数
if(offsettemp1)
break;
else
{
offsetoffsettemp;
}
}
cYeari;
leapGetChineseLeapMonth(cYear);计算该年闰哪个月
设定当年是否有闰月
if(leap0)
{
cIsLeapYeartrue;
}
else
{
cIsLeapYearfalse;
}
cIsLeapMonthfalse;
for(i1;i12;i)
{
闰月
if((leap0)(ileap1)(cIsLeapMonthfalse))
{
cIsLeapMonthtrue;
ii1;
tempGetChineseLeapMonthDays(cYear);计算闰月天数
}
else
{
cIsLeapMonthfalse;
tempGetChineseMonthDays(cYear,i);计算非闰月天数
}
offsetoffsettemp;
if(offset0)break;
}
offsetoffsettemp;
cMonthi;
cDayoffset;
}
endregion
regionChinaCalendar农历日期初始化
用农历的日期来初使化
农历年param
农历月param
农历日param
闰月标志param
publicEcanChineseCalendar(intcy,intcm,intcd,boolleapMonthFlag)
{
inti,leap,Temp,offset;
CheckChineseDateLimit(cy,cm,cd,leapMonthFlag);
cYearcy;
cMonthcm;
cDaycd;
offset0;
for(iMinYear;icy;i)
{
TempGetChineseYearDays(i);求当年农历年天数
offsetoffsetTemp;
}
leapGetChineseLeapMonth(cy);计算该年应该闰哪个月
if(leap!0)
{
this。cIsLeapYeartrue;
}
else
{
this。cIsLeapYearfalse;
}
if(cm!leap)
{
cIsLeapMonthfalse;当前日期并非闰月
}
else
{
cIsLeapMonthleapMonthFlag;使用用户输入的是否闰月月份
}
if((cIsLeapYearfalse)当年没有闰月
(cmleap))计算月份小于闰月
{
region。。。
for(i1;icm;i)
{
TempGetChineseMonthDays(cy,i);计算非闰月天数
offsetoffsetTemp;
}
检查日期是否大于最大天
if(cdGetChineseMonthDays(cy,cm))
{
thrownewnewCalendarException(不合法的农历日期);
}
offsetoffsetcd;加上当月的天数
endregion
}
else是闰年,且计算月份大于或等于闰月
{
region。。。
for(i1;icm;i)
{
TempGetChineseMonthDays(cy,i);计算非闰月天数
offsetoffsetTemp;
}
if(cmleap)计算月大于闰月
{
TempGetChineseLeapMonthDays(cy);计算闰月天数
offsetoffsetTemp;加上闰月天数
if(cdGetChineseMonthDays(cy,cm))
{
thrownewnewCalendarException(不合法的农历日期);
}
offsetoffsetcd;
}
else计算月等于闰月
{
如果需要计算的是闰月,则应首先加上与闰月对应的普通月的天数
if(this。cIsLeapMonthtrue)计算月为闰月
{
TempGetChineseMonthDays(cy,cm);计算非闰月天数
offsetoffsetTemp;
}
if(cdGetChineseLeapMonthDays(cy))
{
thrownewnewCalendarException(不合法的农历日期);
}
offsetoffsetcd;
}
endregion
}
dateMinDay。AddDays(offset);
}
endregion
endregion
region私有函数
regionGetChineseMonthDays
传回农历y年m月的总天数
privateintGetChineseMonthDays(intyear,intmonth)
{
if(BitTest32((LunarDateArray〔yearMinYear〕0x0000FFFF),(16month)))
{
return30;
}
else
{
return29;
}
}
endregion
regionGetChineseLeapMonth
传回农历y年闰哪个月112,没闰传回0
privateintGetChineseLeapMonth(intyear)
{
returnLunarDateArray〔yearMinYear〕0xF;
}
endregion
regionGetChineseLeapMonthDays
传回农历y年闰月的天数
privateintGetChineseLeapMonthDays(intyear)
{
if(GetChineseLeapMonth(year)!0)
{
if((LunarDateArray〔yearMinYear〕0x10000)!0)
{
return30;
}
else
{
return29;
}
}
else
{
return0;
}
}
endregion
regionGetChineseYearDays
取农历年一年的天数
param
privateintGetChineseYearDays(intyear)
{
inti,f,sumDay,info;
sumDay348;29天X12个月
i0x8000;
infoLunarDateArray〔yearMinYear〕0x0FFFF;
计算12个月中有多少天为30天
for(intm0;m12;m)
{
finfoi;
if(f!0)
{
sumDay;
}
ii1;
}
returnsumDayGetChineseLeapMonthDays(year);
}
endregion
regionGetChineseHour
获得当前时间的时辰
param
privatestringGetChineseHour(DateTimedt)
{
inthour,minute,offset,i;
intindexGan;
stringganHour,zhiHour;
stringtmpGan;
计算时辰的地支
hourdt。Hour;获得当前时间小时
minutedt。Minute;获得当前时间分钟
if(minute!0)hour1;
offsethour2;
if(offset12)offset0;
zhiHourzhiStr〔offset〕。ToString();
计算天干
TimeSpantsthis。dateGanZhiStartDay;
its。Days60;
indexGan((i101)21)101;ganStr〔i10〕为日的天干,(n21)10得出地支对应,n从1开始
tmpGanganStr。Substring(indexGan)ganStr。Substring(0,indexGan2);凑齐12位
ganHourganStr〔((i101)21)101〕。ToString();
returntmpGan〔offset〕。ToString()zhiStr〔offset〕。ToString();
}
endregion
regionCheckDateLimit
检查公历日期是否符合要求
param
privatevoidCheckDateLimit(DateTimedt)
{
if((dtMinDay)(dtMaxDay))
{
thrownewnewCalendarException(超出可转换的日期);
}
}
endregion
regionCheckChineseDateLimit
检查农历日期是否合理
param
param
param
param
privatevoidCheckChineseDateLimit(intyear,intmonth,intday,boolleapMonth)
{
if((yearMinYear)(yearMaxYear))
{
thrownewnewCalendarException(非法农历日期);
}
if((month1)(month12))
{
thrownewnewCalendarException(非法农历日期);
}
if((day1)(day30))中国的月最多30天
{
thrownewnewCalendarException(非法农历日期);
}
intleapGetChineseLeapMonth(year);计算该年应该闰哪个月
if((leapMonthtrue)(month!leap))
{
thrownewnewCalendarException(非法农历日期);
}
}
endregion
regionConvertNumToChineseNum
将09转成汉字形式
param
privatestringConvertNumToChineseNum(charn)
{
if((n0)(n9))return;
switch(n)
{
case0:
returnHZNum〔0〕。ToString();
case1:
returnHZNum〔1〕。ToString();
case2:
returnHZNum〔2〕。ToString();
case3:
returnHZNum〔3〕。ToString();
case4:
returnHZNum〔4〕。ToString();
case5:
returnHZNum〔5〕。ToString();
case6:
returnHZNum〔6〕。ToString();
case7:
returnHZNum〔7〕。ToString();
case8:
returnHZNum〔8〕。ToString();
case9:
returnHZNum〔9〕。ToString();
default:
return;
}
}
endregion
regionBitTest32
测试某位是否为真
param
param
privateboolBitTest32(intnum,intbitpostion)
{
if((bitpostion31)(bitpostion0))
thrownewException(ErrorParam:bitpostion〔031〕:bitpostion。ToString());
intbit1bitpostion;
if((numbit)0)
{
returnfalse;
}
else
{
returntrue;
}
}
endregion
regionConvertDayOfWeek
将星期几转成数字表示
param
privateintConvertDayOfWeek(DayOfWeekdayOfWeek)
{
switch(dayOfWeek)
{
caseDayOfWeek。Sunday:
return1;
caseDayOfWeek。Monday:
return2;
caseDayOfWeek。Tuesday:
return3;
caseDayOfWeek。Wednesday:
return4;
caseDayOfWeek。Thursday:
return5;
caseDayOfWeek。Friday:
return6;
caseDayOfWeek。Saturday:
return7;
default:
return0;
}
}
endregion
regionCompareWeekDayHoliday
比较当天是不是指定的第周几
param
param
param
param
privateboolCompareWeekDayHoliday(DateTimedate,intmonth,intweek,intday)
{
boolretfalse;
if(date。Monthmonth)月份相同
{
if(ConvertDayOfWeek(date。DayOfWeek)day)星期几相同
{
DateTimefirstDaynewDateTime(date。Year,date。Month,1);生成当月第一天
intiConvertDayOfWeek(firstDay。DayOfWeek);
intfirWeekDays7ConvertDayOfWeek(firstDay。DayOfWeek)1;计算第一周剩余天数
if(iday)
{
if((week1)7dayfirWeekDaysdate。Day)
{
rettrue;
}
}
else
{
if(dayfirWeekDays(week2)7date。Day)
{
rettrue;
}
}
}
}
returnret;
}
endregion
endregion
region属性
region节日
regionnewCalendarHoliday
计算中国农历节日
publicstringnewCalendarHoliday
{
get
{
stringtempStr;
if(this。cIsLeapMonthfalse)闰月不计算节日
{
foreach(LunarHolidayStructlhinlHolidayInfo)
{
if((lh。Monththis。cMonth)(lh。Daythis。cDay))
{
tempStrlh。HolidayName;
break;
}
}
对除夕进行特别处理
if(this。cMonth12)
{
intiGetChineseMonthDays(this。cYear,12);计算当年农历12月的总天数
if(this。cDayi)如果为最后一天
{
tempStr除夕;
}
}
}
returntempStr;
}
}
endregion
regionWeekDayHoliday
按某月第几周第几日计算的节日
publicstringWeekDayHoliday
{
get
{
stringtempStr;
foreach(WeekHolidayStructwhinwHolidayInfo)
{
if(CompareWeekDayHoliday(date,wh。Month,wh。WeekAtMonth,wh。WeekDay))
{
tempStrwh。HolidayName;
break;
}
}
returntempStr;
}
}
endregion
regionDateHoliday
按公历日计算的节日
publicstringDateHoliday
{
get
{
stringtempStr;
foreach(SolarHolidayStructshinsHolidayInfo)
{
if((sh。Monthdate。Month)(sh。Daydate。Day))
{
tempStrsh。HolidayName;
break;
}
}
returntempStr;
}
}
endregion
endregion
region公历日期
regionDate
取对应的公历日期
publicDateTimeDate
{
get{returndate;}
set{datevalue;}
}
endregion
regionWeekDay
取星期几
publicDayOfWeekWeekDay
{
get{returndate。DayOfWeek;}
}
endregion
regionWeekDayStr
周几的字符
publicstringWeekDayStr
{
get
{
switch(date。DayOfWeek)
{
caseDayOfWeek。Sunday:
return星期日;
caseDayOfWeek。Monday:
return星期一;
caseDayOfWeek。Tuesday:
return星期二;
caseDayOfWeek。Wednesday:
return星期三;
caseDayOfWeek。Thursday:
return星期四;
caseDayOfWeek。Friday:
return星期五;
default:
return星期六;
}
}
}
endregion
regionDateString
公历日期中文表示法如一九九七年七月一日
publicstringDateString
{
get
{
return公元this。date。ToLongDateString();
}
}
endregion
regionIsLeapYear
当前是否公历闰年
publicboolIsLeapYear
{
get
{
returnDateTime。IsLeapYear(this。date。Year);
}
}
endregion
regionChineseConstellation
28星宿计算
publicstringChineseConstellation
{
get
{
intoffset0;
intmodStarDay0;
TimeSpantsthis。dateChineseConstellationReferDay;
offsetts。Days;
modStarDayoffset28;
return(modStarDay0?chineseConstellationName〔modStarDay〕:chineseConstellationName〔27modStarDay〕);
}
}
endregion
regionChineseHour
时辰
publicstringChineseHour
{
get
{
returnGetChineseHour(datetime);
}
}
endregion
endregion
region农历日期
regionIsChineseLeapMonth
是否闰月
publicboolIsChineseLeapMonth
{
get{returnthis。cIsLeapMonth;}
}
endregion
regionIsChineseLeapYear
当年是否有闰月
publicboolIsChineseLeapYear
{
get
{
returnthis。cIsLeapYear;
}
}
endregion
regionChineseDay
农历日
publicintChineseDay
{
get{returnthis。cDay;}
}
endregion
regionChineseDayString
农历日中文表示
publicstringChineseDayString
{
get
{
switch(this。cDay)
{
case0:
return;
case10:
return初十;
case20:
return二十;
case30:
return三十;
default:
returnnStr2〔(int)(cDay10)〕。ToString()nStr1〔cDay10〕。ToString();
}
}
}
endregion
regionChineseMonth
农历的月份
publicintChineseMonth
{
get{returnthis。cMonth;}
}
endregion
regionChineseMonthString
农历月份字符串
publicstringChineseMonthString
{
get
{
returnmonthString〔this。cMonth〕;
}
}
endregion
regionChineseYear
取农历年份
publicintChineseYear
{
get{returnthis。cYear;}
}
endregion
regionChineseYearString
取农历年字符串如,一九九七年
publicstringChineseYearString
{
get
{
stringtempStr;
stringnumthis。cYear。ToString();
for(inti0;i4;i)
{
tempStrConvertNumToChineseNum(num〔i〕);
}
returntempStr年;
}
}
endregion
regionChineseDateString
取农历日期表示法:农历一九九七年正月初五
publicstringChineseDateString
{
get
{
if(this。cIsLeapMonthtrue)
{
return农历ChineseYearString闰ChineseMonthStringChineseDayString;
}
else
{
return农历ChineseYearStringChineseMonthStringChineseDayString;
}
}
}
endregion
regionChineseTwentyFourDay
定气法计算二十四节气,二十四节气是按地球公转来计算的,并非是阴历计算的
节气的定法有两种。古代历法采用的称为恒气,即按时间把一年等分为24份,
每一节气平均得15天有余,所以又称平气。现代农历采用的称为定气,即
按地球在轨道上的位置为标准,一周360,两节气之间相隔15。由于冬至时地
球位于近日点附近,运动速度较快,因而太阳在黄道上移动15的时间不到15天。
夏至前后的情况正好相反,太阳在黄道上移动较慢,一个节气达16天之多。采用
定气时可以保证春、秋两分必然在昼夜平分的那两天。
publicstringChineseTwentyFourDay
{
get
{
DateTimebaseDateAndTimenewDateTime(1900,1,6,2,5,0);1619002:05:00AM
DateTimenewDate;
doublenum;
inty;
stringtempStr;
ythis。date。Year;
for(inti1;i24;i)
{
num525948。76(y1900)sTermInfo〔i1〕;
newDatebaseDateAndTime。AddMinutes(num);按分钟计算
if(newDate。DayOfYeardate。DayOfYear)
{
tempStrSolarTerm〔i1〕;
break;
}
}
returntempStr;
}
}
当前日期前一个最近节气
publicstringChineseTwentyFourPrevDay
{
get
{
DateTimebaseDateAndTimenewDateTime(1900,1,6,2,5,0);1619002:05:00AM
DateTimenewDate;
doublenum;
inty;
stringtempStr;
ythis。date。Year;
for(inti24;i1;i)
{
num525948。76(y1900)sTermInfo〔i1〕;
newDatebaseDateAndTime。AddMinutes(num);按分钟计算
if(newDate。DayOfYeardate。DayOfYear)
{
tempStrstring。Format({0}〔{1}〕,SolarTerm〔i1〕,newDate。ToString(yyyyMMdd));
break;
}
}
returntempStr;
}
}
当前日期后一个最近节气
publicstringChineseTwentyFourNextDay
{
get
{
DateTimebaseDateAndTimenewDateTime(1900,1,6,2,5,0);1619002:05:00AM
DateTimenewDate;
doublenum;
inty;
stringtempStr;
ythis。date。Year;
for(inti1;i24;i)
{
num525948。76(y1900)sTermInfo〔i1〕;
newDatebaseDateAndTime。AddMinutes(num);按分钟计算
if(newDate。DayOfYeardate。DayOfYear)
{
tempStrstring。Format({0}〔{1}〕,SolarTerm〔i1〕,newDate。ToString(yyyyMMdd));
break;
}
}
returntempStr;
}
}
endregion
endregion
region星座
regionConstellation
计算指定日期的星座序号
publicstringConstellation
{
get
{
intindex0;
inty,m,d;
ydate。Year;
mdate。Month;
ddate。Day;
ym100d;
if(((y321)(y419))){index0;}
elseif((y420)(y520)){index1;}
elseif((y521)(y620)){index2;}
elseif((y621)(y722)){index3;}
elseif((y723)(y822)){index4;}
elseif((y823)(y922)){index5;}
elseif((y923)(y1022)){index6;}
elseif((y1023)(y1121)){index7;}
elseif((y1122)(y1221)){index8;}
elseif((y1222)(y119)){index9;}
elseif((y120)(y218)){index10;}
elseif((y219)(y320)){index11;}
else{index0;}
returnconstellationName〔index〕;
}
}
endregion
endregion
region属相
regionAnimal
计算属相的索引,注意虽然属相是以农历年来区别的,但是目前在实际使用中是按公历来计算的
鼠年为1,其它类推
publicintAnimal
{
get
{
intoffsetdate。YearAnimalStartYear;
return(offset12)1;
}
}
endregion
regionAnimalString
取属相字符串
publicstringAnimalString
{
get
{
intoffsetdate。YearAnimalStartYear;阳历计算
intoffsetthis。cYearAnimalStartYear;农历计算
returnanimalStr〔offset12〕。ToString();
}
}
endregion
endregion
region天干地支
regionGanZhiYearString
取农历年的干支表示法如乙丑年
publicstringGanZhiYearString
{
get
{
stringtempStr;
inti(this。cYearGanZhiStartYear)60;计算干支
tempStrganStr〔i10〕。ToString()zhiStr〔i12〕。ToString()年;
returntempStr;
}
}
endregion
regionGanZhiMonthString
取干支的月表示字符串,注意农历的闰月不记干支
publicstringGanZhiMonthString
{
get
{
每个月的地支总是固定的,而且总是从寅月开始
intzhiIndex;
stringzhi;
if(this。cMonth10)
{
zhiIndexthis。cMonth10;
}
else
{
zhiIndexthis。cMonth2;
}
zhizhiStr〔zhiIndex1〕。ToString();
根据当年的干支年的干来计算月干的第一个
intganIndex1;
stringgan;
inti(this。cYearGanZhiStartYear)60;计算干支
switch(i10)
{
region。。。
case0:甲
ganIndex3;
break;
case1:乙
ganIndex5;
break;
case2:丙
ganIndex7;
break;
case3:丁
ganIndex9;
break;
case4:戊
ganIndex1;
break;
case5:己
ganIndex3;
break;
case6:庚
ganIndex5;
break;
case7:辛
ganIndex7;
break;
case8:壬
ganIndex9;
break;
case9:癸
ganIndex1;
break;
endregion
}
ganganStr〔(ganIndexthis。cMonth2)10〕。ToString();
returnganzhi月;
}
}
endregion
regionGanZhiDayString
取干支日表示法
publicstringGanZhiDayString
{
get
{
inti,offset;
TimeSpantsthis。dateGanZhiStartDay;
offsetts。Days;
ioffset60;
returnganStr〔i10〕。ToString()zhiStr〔i12〕。ToString()日;
}
}
endregion
regionGanZhiDateString
取当前日期的干支表示法如甲子年乙丑月丙庚日
publicstringGanZhiDateString
{
get
{
returnGanZhiYearStringGanZhiMonthStringGanZhiDayString;
}
}
endregion
endregion
endregion
region方法
regionNextDay
取下一天
publicEcanChineseCalendarNextDay()
{
DateTimenextDaydate。AddDays(1);
returnnewEcanChineseCalendar(nextDay);
}
endregion
regionPervDay
取前一天
publicEcanChineseCalendarPervDay()
{
DateTimepervDaydate。AddDays(1);
returnnewEcanChineseCalendar(pervDay);
}
endregion
endregion
}
}