c#實(shí)現(xiàn)萬(wàn)年歷示例分享 萬(wàn)年歷農(nóng)歷查詢
using System.Collections.Generic;
using System.Text;
using System;
namespace yangliToyinli
{
#region ChineseCalendarException
/// <summary>
/// 中國(guó)日歷異常處理
/// </summary>
public class ChineseCalendarException : System.Exception
{
public ChineseCalendarException(string msg)
: base(msg)
{
}
}
#endregion
/// <summary>
/// 中國(guó)農(nóng)歷類(lèi) 版本V1.0 支持 1900.1.31日起至 2049.12.31日止的數(shù)據(jù)
/// </summary>
/// <remarks>
/// 本程序使用數(shù)據(jù)來(lái)源于網(wǎng)上的萬(wàn)年歷查詢,并綜合了一些其它數(shù)據(jù)
/// </remarks>
public class ChineseCalendar
{
#region 內(nèi)部結(jié)構(gòu)
private struct SolarHolidayStruct
{
public int Month;
public int Day;
public int Recess; //假期長(zhǎng)度
public string HolidayName;
public SolarHolidayStruct(int month, int day, int recess, string name)
{
Month = month;
Day = day;
Recess = recess;
HolidayName = name;
}
}
private struct LunarHolidayStruct
{
public int Month;
public int Day;
public int Recess;
public string HolidayName;
public LunarHolidayStruct(int month, int day, int recess, string name)
{
Month = month;
Day = day;
Recess = recess;
HolidayName = name;
}
}
private struct WeekHolidayStruct
{
public int Month;
public int WeekAtMonth;
public int WeekDay;
public string HolidayName;
public WeekHolidayStruct(int month, int weekAtMonth, int weekDay, string name)
{
Month = month;
WeekAtMonth = weekAtMonth;
WeekDay = weekDay;
HolidayName = name;
}
}
#endregion
#region 內(nèi)部變量
private DateTime _date;
private DateTime _datetime;
private int _cYear;
private int _cMonth;
private int _cDay;
private bool _cIsLeapMonth; //當(dāng)月是否閏月
private bool _cIsLeapYear; //當(dāng)年是否有閏月
#endregion
#region 基礎(chǔ)數(shù)據(jù)
#region 基本常量
private const int MinYear = 1900;
private const int MaxYear = 2050;
private static DateTime MinDay = new DateTime(1900, 1, 30);
private static DateTime MaxDay = new DateTime(2049, 12, 31);
private const int GanZhiStartYear = 1864; //干支計(jì)算起始年
private static DateTime GanZhiStartDay = new DateTime(1899, 12, 22);//起始日
private const string HZNum = "零一二三四五六七八九";
private const int AnimalStartYear = 1900; //1900年為鼠年
private static DateTime ChineseConstellationReferDay = new DateTime(2007, 9, 13);//28星宿參考值,本日為角
#endregion
#region 陰歷數(shù)據(jù)
/// <summary>
/// 來(lái)源于網(wǎng)上的農(nóng)歷數(shù)據(jù)
/// </summary>
/// <remarks>
/// 數(shù)據(jù)結(jié)構(gòu)如下,共使用17位數(shù)據(jù)
/// 第17位:表示閏月天數(shù),0表示29天 1表示30天
/// 第16位-第5位(共12位)表示12個(gè)月,其中第16位表示第一月,如果該月為30天則為1,29天為0
/// 第4位-第1位(共4位)表示閏月是哪個(gè)月,如果當(dāng)年沒(méi)有閏月,則置0
///</remarks>
private static int[] LunarDateArray = new int[]{
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 星座名稱
private static string[] _constellationName =
{
"白羊座", "金牛座", "雙子座",
"巨蟹座", "獅子座", "處女座",
"天秤座", "天蝎座", "射手座",
"摩羯座", "水瓶座", "雙魚(yú)座"
};
#endregion
#region 二十四節(jié)氣
private static string[] _lunarHolidayName =
{
"小寒", "大寒", "立春", "雨水",
"驚蟄", "春分", "清明", "谷雨",
"立夏", "小滿", "芒種", "夏至",
"小暑", "大暑", "立秋", "處暑",
"白露", "秋分", "寒露", "霜降",
"立冬", "小雪", "大雪", "冬至"
};
#endregion
#region 二十八星宿
private static string[] _chineseConstellationName =
{
//四 五 六 日 一 二 三
"角木蛟","亢金龍","女土蝠","房日兔","心月狐","尾火虎","箕水豹",
"斗木獬","牛金牛","氐土貉","虛日鼠","危月燕","室火豬","壁水獝",
"奎木狼","婁金狗","胃土彘","昴日雞","畢月烏","觜火猴","參水猿",
"井木犴","鬼金羊","柳土獐","星日馬","張?jiān)侣?,"翼火蛇","軫水蚓"
};
#endregion
#region 節(jié)氣數(shù)據(jù)
private static string[] SolarTerm = new string[] { "小寒", "大寒", "立春", "雨水", "驚蟄", "春分", "清明", "谷雨", "立夏", "小滿", "芒種", "夏至", "小暑", "大暑", "立秋", "處暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至" };
private static int[] sTermInfo = new int[] { 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 農(nóng)歷相關(guān)數(shù)據(jù)
private static string ganStr = "甲乙丙丁戊己庚辛壬癸";
private static string zhiStr = "子丑寅卯辰巳午未申酉戌亥";
private static string animalStr = "鼠?;⑼谬埳唏R羊猴雞狗豬";
private static string nStr1 = "日一二三四五六七八九";
private static string nStr2 = "初十廿卅";
private static string[] _monthString =
{
"出錯(cuò)","正月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","臘月"
};
#endregion
#region 按公歷計(jì)算的節(jié)日
private static SolarHolidayStruct[] sHolidayInfo = new SolarHolidayStruct[]{
new SolarHolidayStruct(1, 1, 1, "元旦"),
new SolarHolidayStruct(2, 2, 0, "世界濕地日"),
new SolarHolidayStruct(2, 10, 0, "國(guó)際氣象節(jié)"),
new SolarHolidayStruct(2, 14, 0, "情人節(jié)"),
new SolarHolidayStruct(3, 1, 0, "國(guó)際海豹日"),
new SolarHolidayStruct(3, 5, 0, "學(xué)雷鋒紀(jì)念日"),
new SolarHolidayStruct(3, 8, 0, "婦女節(jié)"),
new SolarHolidayStruct(3, 12, 0, "植樹(shù)節(jié) 孫中山逝世紀(jì)念日"),
new SolarHolidayStruct(3, 14, 0, "國(guó)際警察日"),
new SolarHolidayStruct(3, 15, 0, "消費(fèi)者權(quán)益日"),
new SolarHolidayStruct(3, 17, 0, "中國(guó)國(guó)醫(yī)節(jié) 國(guó)際航海日"),
new SolarHolidayStruct(3, 21, 0, "世界森林日 消除種族歧視國(guó)際日 世界兒歌日"),
new SolarHolidayStruct(3, 22, 0, "世界水日"),
new SolarHolidayStruct(3, 24, 0, "世界防治結(jié)核病日"),
new SolarHolidayStruct(4, 1, 0, "愚人節(jié)"),
new SolarHolidayStruct(4, 7, 0, "世界衛(wèi)生日"),
new SolarHolidayStruct(4, 22, 0, "世界地球日"),
new SolarHolidayStruct(5, 1, 1, "勞動(dòng)節(jié)"),
new SolarHolidayStruct(5, 2, 1, "勞動(dòng)節(jié)假日"),
new SolarHolidayStruct(5, 3, 1, "勞動(dòng)節(jié)假日"),
new SolarHolidayStruct(5, 4, 0, "青年節(jié)"),
new SolarHolidayStruct(5, 8, 0, "世界紅十字日"),
new SolarHolidayStruct(5, 12, 0, "國(guó)際護(hù)士節(jié)"),
new SolarHolidayStruct(5, 31, 0, "世界無(wú)煙日"),
new SolarHolidayStruct(6, 1, 0, "國(guó)際兒童節(jié)"),
new SolarHolidayStruct(6, 5, 0, "世界環(huán)境保護(hù)日"),
new SolarHolidayStruct(6, 26, 0, "國(guó)際禁毒日"),
new SolarHolidayStruct(7, 1, 0, "建黨節(jié) 香港回歸紀(jì)念 世界建筑日"),
new SolarHolidayStruct(7, 11, 0, "世界人口日"),
new SolarHolidayStruct(8, 1, 0, "建軍節(jié)"),
new SolarHolidayStruct(8, 8, 0, "中國(guó)男子節(jié) 父親節(jié)"),
new SolarHolidayStruct(8, 15, 0, "抗日戰(zhàn)爭(zhēng)勝利紀(jì)念"),
new SolarHolidayStruct(9, 9, 0, " 逝世紀(jì)念"),
new SolarHolidayStruct(9, 10, 0, "教師節(jié)"),
new SolarHolidayStruct(9, 18, 0, "九·一八事變紀(jì)念日"),
new SolarHolidayStruct(9, 20, 0, "國(guó)際愛(ài)牙日"),
new SolarHolidayStruct(9, 27, 0, "世界旅游日"),
new SolarHolidayStruct(9, 28, 0, "孔子誕辰"),
new SolarHolidayStruct(10, 1, 1, "國(guó)慶節(jié) 國(guó)際音樂(lè)日"),
new SolarHolidayStruct(10, 2, 1, "國(guó)慶節(jié)假日"),
new SolarHolidayStruct(10, 3, 1, "國(guó)慶節(jié)假日"),
new SolarHolidayStruct(10, 6, 0, "老人節(jié)"),
new SolarHolidayStruct(10, 24, 0, "聯(lián)合國(guó)日"),
new SolarHolidayStruct(11, 10, 0, "世界青年節(jié)"),
new SolarHolidayStruct(11, 12, 0, "孫中山誕辰紀(jì)念"),
new SolarHolidayStruct(12, 1, 0, "世界艾滋病日"),
new SolarHolidayStruct(12, 3, 0, "世界殘疾人日"),
new SolarHolidayStruct(12, 20, 0, "澳門(mén)回歸紀(jì)念"),
new SolarHolidayStruct(12, 24, 0, "平安夜"),
new SolarHolidayStruct(12, 25, 0, "圣誕節(jié)"),
new SolarHolidayStruct(12, 26, 0, " 誕辰紀(jì)念")
};
#endregion
#region 按農(nóng)歷計(jì)算的節(jié)日
private static LunarHolidayStruct[] lHolidayInfo = new LunarHolidayStruct[]{
new LunarHolidayStruct(1, 1, 1, "春節(jié)"),
new LunarHolidayStruct(1, 15, 0, "元宵節(jié)"),
new LunarHolidayStruct(5, 5, 0, "端午節(jié)"),
new LunarHolidayStruct(7, 7, 0, "七夕情人節(jié)"),
new LunarHolidayStruct(7, 15, 0, "中元節(jié) 盂蘭盆節(jié)"),
new LunarHolidayStruct(8, 15, 0, "中秋節(jié)"),
new LunarHolidayStruct(9, 9, 0, "重陽(yáng)節(jié)"),
new LunarHolidayStruct(12, 8, 0, "臘八節(jié)"),
new LunarHolidayStruct(12, 23, 0, "北方小年(掃房)"),
new LunarHolidayStruct(12, 24, 0, "南方小年(撣塵)"),
//new LunarHolidayStruct(12, 30, 0, "除夕") //注意除夕需要其它方法進(jìn)行計(jì)算
};
#endregion
#region 按某月第幾個(gè)星期幾
private static WeekHolidayStruct[] wHolidayInfo = new WeekHolidayStruct[]{
new WeekHolidayStruct(5, 2, 1, "母親節(jié)"),
new WeekHolidayStruct(5, 3, 1, "全國(guó)助殘日"),
new WeekHolidayStruct(6, 3, 1, "父親節(jié)"),
new WeekHolidayStruct(9, 3, 3, "國(guó)際和平日"),
new WeekHolidayStruct(9, 4, 1, "國(guó)際聾人節(jié)"),
new WeekHolidayStruct(10, 1, 2, "國(guó)際住房日"),
new WeekHolidayStruct(10, 1, 4, "國(guó)際減輕自然災(zāi)害日"),
new WeekHolidayStruct(11, 4, 5, "感恩節(jié)")
};
#endregion
#endregion
#region 構(gòu)造函數(shù)
#region ChinaCalendar <公歷日期初始化>
/// <summary>
/// 用一個(gè)標(biāo)準(zhǔn)的公歷日期來(lái)初使化
/// </summary>
/// <param name="dt"></param>
public ChineseCalendar(DateTime dt)
{
int i;
int leap;
int temp;
int offset;
CheckDateLimit(dt);
_date = dt.Date;
_datetime = dt;
//農(nóng)歷日期計(jì)算部分
leap = 0;
temp = 0;
TimeSpan ts = _date - ChineseCalendar.MinDay;//計(jì)算兩天的基本差距
offset = ts.Days;
for (i = MinYear; i <= MaxYear; i++)
{
temp = GetChineseYearDays(i); //求當(dāng)年農(nóng)歷年天數(shù)
if (offset - temp < 1)
break;
else
{
offset = offset - temp;
}
}
_cYear = i;
leap = GetChineseLeapMonth(_cYear);//計(jì)算該年閏哪個(gè)月
//設(shè)定當(dāng)年是否有閏月
if (leap > 0)
{
_cIsLeapYear = true;
}
else
{
_cIsLeapYear = false;
}
_cIsLeapMonth = false;
for (i = 1; i <= 12; i++)
{
//閏月
if ((leap > 0) && (i == leap + 1) && (_cIsLeapMonth == false))
{
_cIsLeapMonth = true;
i = i - 1;
temp = GetChineseLeapMonthDays(_cYear); //計(jì)算閏月天數(shù)
}
else
{
_cIsLeapMonth = false;
temp = GetChineseMonthDays(_cYear, i);//計(jì)算非閏月天數(shù)
}
offset = offset - temp;
if (offset <= 0) break;
}
offset = offset + temp;
_cMonth = i;
_cDay = offset;
}
#endregion
#region ChinaCalendar <農(nóng)歷日期初始化>
/// <summary>
/// 用農(nóng)歷的日期來(lái)初使化
/// </summary>
/// <param name="cy">農(nóng)歷年</param>
/// <param name="cm">農(nóng)歷月</param>
/// <param name="cd">農(nóng)歷日</param>
/// <param name="LeapFlag">閏月標(biāo)志</param>
public ChineseCalendar(int cy, int cm, int cd, bool leapMonthFlag)
{
int i, leap, Temp, offset;
CheckChineseDateLimit(cy, cm, cd, leapMonthFlag);
_cYear = cy;
_cMonth = cm;
_cDay = cd;
offset = 0;
for (i = MinYear; i < cy; i++)
{
Temp = GetChineseYearDays(i); //求當(dāng)年農(nóng)歷年天數(shù)
offset = offset + Temp;
}
leap = GetChineseLeapMonth(cy);// 計(jì)算該年應(yīng)該閏哪個(gè)月
if (leap != 0)
{
this._cIsLeapYear = true;
}
else
{
this._cIsLeapYear = false;
}
if (cm != leap)
{
_cIsLeapMonth = false; //當(dāng)前日期并非閏月
}
else
{
_cIsLeapMonth = leapMonthFlag; //使用用戶輸入的是否閏月月份
}
if ((_cIsLeapYear == false) || //當(dāng)年沒(méi)有閏月
(cm < leap)) //計(jì)算月份小于閏月
{
#region ...
for (i = 1; i < cm; i++)
{
Temp = GetChineseMonthDays(cy, i);//計(jì)算非閏月天數(shù)
offset = offset + Temp;
}
//檢查日期是否大于最大天
if (cd > GetChineseMonthDays(cy, cm))
{
throw new ChineseCalendarException("不合法的農(nóng)歷日期");
}
offset = offset + cd; //加上當(dāng)月的天數(shù)
#endregion
}
else //是閏年,且計(jì)算月份大于或等于閏月
{
#region ...
for (i = 1; i < cm; i++)
{
Temp = GetChineseMonthDays(cy, i); //計(jì)算非閏月天數(shù)
offset = offset + Temp;
}
if (cm > leap) //計(jì)算月大于閏月
{
Temp = GetChineseLeapMonthDays(cy); //計(jì)算閏月天數(shù)
offset = offset + Temp; //加上閏月天數(shù)
if (cd > GetChineseMonthDays(cy, cm))
{
throw new ChineseCalendarException("不合法的農(nóng)歷日期");
}
offset = offset + cd;
}
else //計(jì)算月等于閏月
{
//如果需要計(jì)算的是閏月,則應(yīng)首先加上與閏月對(duì)應(yīng)的普通月的天數(shù)
if (this._cIsLeapMonth == true) //計(jì)算月為閏月
{
Temp = GetChineseMonthDays(cy, cm); //計(jì)算非閏月天數(shù)
offset = offset + Temp;
}
if (cd > GetChineseLeapMonthDays(cy))
{
throw new ChineseCalendarException("不合法的農(nóng)歷日期");
}
offset = offset + cd;
}
#endregion
}
_date = MinDay.AddDays(offset);
}
#endregion
#endregion
#region 私有函數(shù)
#region GetChineseMonthDays
//傳回農(nóng)歷 y年m月的總天數(shù)
private int GetChineseMonthDays(int year, int month)
{
if (BitTest32((LunarDateArray[year - MinYear] & 0x0000FFFF), (16 - month)))
{
return 30;
}
else
{
return 29;
}
}
#endregion
#region GetChineseLeapMonth
//傳回農(nóng)歷 y年閏哪個(gè)月 1-12 , 沒(méi)閏傳回 0
private int GetChineseLeapMonth(int year)
{
return LunarDateArray[year - MinYear] & 0xF;
}
#endregion
#region GetChineseLeapMonthDays
//傳回農(nóng)歷 y年閏月的天數(shù)
private int GetChineseLeapMonthDays(int year)
{
if (GetChineseLeapMonth(year) != 0)
{
if ((LunarDateArray[year - MinYear] & 0x10000) != 0)
{
return 30;
}
else
{
return 29;
}
}
else
{
return 0;
}
}
#endregion
#region GetChineseYearDays
/// <summary>
/// 取農(nóng)歷年一年的天數(shù)
/// </summary>
/// <param name="year"></param>
/// <returns></returns>
private int GetChineseYearDays(int year)
{
int i, f, sumDay, info;
sumDay = 348; //29天 X 12個(gè)月
i = 0x8000;
info = LunarDateArray[year - MinYear] & 0x0FFFF;
//計(jì)算12個(gè)月中有多少天為30天
for (int m = 0; m < 12; m++)
{
f = info & i;
if (f != 0)
{
sumDay++;
}
i = i >> 1;
}
return sumDay + GetChineseLeapMonthDays(year);
}
#endregion
#region GetChineseHour
/// <summary>
/// 獲得當(dāng)前時(shí)間的時(shí)辰
/// </summary>
/// <param name="time"></param>
/// <returns></returns>
///
private string GetChineseHour(DateTime dt)
{
int _hour, _minute, offset, i;
int indexGan;
string ganHour, zhiHour;
string tmpGan;
//計(jì)算時(shí)辰的地支
_hour = dt.Hour; //獲得當(dāng)前時(shí)間小時(shí)
_minute = dt.Minute; //獲得當(dāng)前時(shí)間分鐘
if (_minute != 0) _hour += 1;
offset = _hour / 2;
if (offset >= 12) offset = 0;
//zhiHour = zhiStr[offset].ToString();
//計(jì)算天干
TimeSpan ts = this._date - GanZhiStartDay;
i = ts.Days % 60;
indexGan = ((i % 10 + 1) * 2 - 1) % 10 - 1; //ganStr[i % 10] 為日的天干,(n*2-1) %10得出地支對(duì)應(yīng),n從1開(kāi)始
tmpGan = ganStr.Substring(indexGan) + ganStr.Substring(0, indexGan + 2);//湊齊12位
//ganHour = ganStr[((i % 10 + 1) * 2 - 1) % 10 - 1].ToString();
return tmpGan[offset].ToString() + zhiStr[offset].ToString();
}
#endregion
#region CheckDateLimit
/// <summary>
/// 檢查公歷日期是否符合要求
/// </summary>
/// <param name="dt"></param>
private void CheckDateLimit(DateTime dt)
{
if ((dt < MinDay) || (dt > MaxDay))
{
throw new ChineseCalendarException("超出可轉(zhuǎn)換的日期");
}
}
#endregion
#region CheckChineseDateLimit
/// <summary>
/// 檢查農(nóng)歷日期是否合理
/// </summary>
/// <param name="year"></param>
/// <param name="month"></param>
/// <param name="day"></param>
/// <param name="leapMonth"></param>
private void CheckChineseDateLimit(int year, int month, int day, bool leapMonth)
{
if ((year < MinYear) || (year > MaxYear))
{
throw new ChineseCalendarException("非法農(nóng)歷日期");
}
if ((month < 1) || (month > 12))
{
throw new ChineseCalendarException("非法農(nóng)歷日期");
}
if ((day < 1) || (day > 30)) //中國(guó)的月最多30天
{
throw new ChineseCalendarException("非法農(nóng)歷日期");
}
int leap = GetChineseLeapMonth(year);// 計(jì)算該年應(yīng)該閏哪個(gè)月
if ((leapMonth == true) && (month != leap))
{
throw new ChineseCalendarException("非法農(nóng)歷日期");
}
}
#endregion
#region ConvertNumToChineseNum
/// <summary>
/// 將0-9轉(zhuǎn)成漢字形式
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
private string ConvertNumToChineseNum(char n)
{
if ((n < '0') || (n > '9')) return "";
switch (n)
{
case '0':
return HZNum[0].ToString();
case '1':
return HZNum[1].ToString();
case '2':
return HZNum[2].ToString();
case '3':
return HZNum[3].ToString();
case '4':
return HZNum[4].ToString();
case '5':
return HZNum[5].ToString();
case '6':
return HZNum[6].ToString();
case '7':
return HZNum[7].ToString();
case '8':
return HZNum[8].ToString();
case '9':
return HZNum[9].ToString();
default:
return "";
}
}
#endregion
#region BitTest32
/// <summary>
/// 測(cè)試某位是否為真
/// </summary>
/// <param name="num"></param>
/// <param name="bitpostion"></param>
/// <returns></returns>
private bool BitTest32(int num, int bitpostion)
{
if ((bitpostion > 31) || (bitpostion < 0))
throw new Exception("Error Param: bitpostion[0-31]:" + bitpostion.ToString());
int bit = 1 << bitpostion;
if ((num & bit) == 0)
{
return false;
}
else
{
return true;
}
}
#endregion
#region ConvertDayOfWeek
/// <summary>
/// 將星期幾轉(zhuǎn)成數(shù)字表示
/// </summary>
/// <param name="dayOfWeek"></param>
/// <returns></returns>
private int ConvertDayOfWeek(DayOfWeek dayOfWeek)
{
switch (dayOfWeek)
{
case DayOfWeek.Sunday:
return 1;
case DayOfWeek.Monday:
return 2;
case DayOfWeek.Tuesday:
return 3;
case DayOfWeek.Wednesday:
return 4;
case DayOfWeek.Thursday:
return 5;
case DayOfWeek.Friday:
return 6;
case DayOfWeek.Saturday:
return 7;
default:
return 0;
}
}
#endregion
#region CompareWeekDayHoliday
/// <summary>
/// 比較當(dāng)天是不是指定的第周幾
/// </summary>
/// <param name="date"></param>
/// <param name="month"></param>
/// <param name="week"></param>
/// <param name="day"></param>
/// <returns></returns>
private bool CompareWeekDayHoliday(DateTime date, int month, int week, int day)
{
bool ret = false;
if (date.Month == month) //月份相同
{
if (ConvertDayOfWeek(date.DayOfWeek) == day) //星期幾相同
{
DateTime firstDay = new DateTime(date.Year, date.Month, 1);//生成當(dāng)月第一天
int i = ConvertDayOfWeek(firstDay.DayOfWeek);
int firWeekDays = 7 - ConvertDayOfWeek(firstDay.DayOfWeek) + 1; //計(jì)算第一周剩余天數(shù)
if (i > day)
{
if ((week - 1) * 7 + day + firWeekDays == date.Day)
{
ret = true;
}
}
else
{
if (day + firWeekDays + (week - 2) * 7 == date.Day)
{
ret = true;
}
}
}
}
return ret;
}
#endregion
#endregion
#region 屬性
#region 節(jié)日
#region ChineseCalendarHoliday
/// <summary>
/// 計(jì)算中國(guó)農(nóng)歷節(jié)日
/// </summary>
public string ChineseCalendarHoliday
{
get
{
string tempStr = "";
if (this._cIsLeapMonth == false) //閏月不計(jì)算節(jié)日
{
foreach (LunarHolidayStruct lh in lHolidayInfo)
{
if ((lh.Month == this._cMonth) && (lh.Day == this._cDay))
{
tempStr = lh.HolidayName;
break;
}
}
//對(duì)除夕進(jìn)行特別處理
if (this._cMonth == 12)
{
int i = GetChineseMonthDays(this._cYear, 12); //計(jì)算當(dāng)年農(nóng)歷12月的總天數(shù)
if (this._cDay == i) //如果為最后一天
{
tempStr = "除夕";
}
}
}
return tempStr;
}
}
#endregion
#region WeekDayHoliday
/// <summary>
/// 按某月第幾周第幾日計(jì)算的節(jié)日
/// </summary>
public string WeekDayHoliday
{
get
{
string tempStr = "";
foreach (WeekHolidayStruct wh in wHolidayInfo)
{
if (CompareWeekDayHoliday(_date, wh.Month, wh.WeekAtMonth, wh.WeekDay))
{
tempStr = wh.HolidayName;
break;
}
}
return tempStr;
}
}
#endregion
#region DateHoliday
/// <summary>
/// 按公歷日計(jì)算的節(jié)日
/// </summary>
public string DateHoliday
{
get
{
string tempStr = "";
foreach (SolarHolidayStruct sh in sHolidayInfo)
{
if ((sh.Month == _date.Month) && (sh.Day == _date.Day))
{
tempStr = sh.HolidayName;
break;
}
}
return tempStr;
}
}
#endregion
#endregion
#region 公歷日期
#region Date
/// <summary>
/// 取對(duì)應(yīng)的公歷日期
/// </summary>
public DateTime Date
{
get { return _date; }
set { _date = value; }
}
#endregion
#region WeekDay
/// <summary>
/// 取星期幾
/// </summary>
public DayOfWeek WeekDay
{
get { return _date.DayOfWeek; }
}
#endregion
#region WeekDayStr
/// <summary>
/// 周幾的字符
/// </summary>
public string WeekDayStr
{
get
{
switch (_date.DayOfWeek)
{
case DayOfWeek.Sunday:
return "星期日";
case DayOfWeek.Monday:
return "星期一";
case DayOfWeek.Tuesday:
return "星期二";
case DayOfWeek.Wednesday:
return "星期三";
case DayOfWeek.Thursday:
return "星期四";
case DayOfWeek.Friday:
return "星期五";
default:
return "星期六";
}
}
}
#endregion
#region DateString
/// <summary>
/// 公歷日期中文表示法 如一九九七年七月一日
/// </summary>
public string DateString
{
get
{
return "公元" + this._date.ToLongDateString();
}
}
#endregion
#region IsLeapYear
/// <summary>
/// 當(dāng)前是否公歷閏年
/// </summary>
public bool IsLeapYear
{
get
{
return DateTime.IsLeapYear(this._date.Year);
}
}
#endregion
#region ChineseConstellation
/// <summary>
/// 28星宿計(jì)算
/// </summary>
public string ChineseConstellation
{
get
{
int offset = 0;
int modStarDay = 0;
TimeSpan ts = this._date - ChineseConstellationReferDay;
offset = ts.Days;
modStarDay = offset % 28;
return (modStarDay >= 0 ? _chineseConstellationName[modStarDay] : _chineseConstellationName[27 + modStarDay]);
}
}
#endregion
#region ChineseHour
/// <summary>
/// 時(shí)辰
/// </summary>
public string ChineseHour
{
get
{
return GetChineseHour(_datetime);
}
}
#endregion
#endregion
#region 農(nóng)歷日期
#region IsChineseLeapMonth
/// <summary>
/// 是否閏月
/// </summary>
public bool IsChineseLeapMonth
{
get { return this._cIsLeapMonth; }
}
#endregion
#region IsChineseLeapYear
/// <summary>
/// 當(dāng)年是否有閏月
/// </summary>
public bool IsChineseLeapYear
{
get
{
return this._cIsLeapYear;
}
}
#endregion
#region ChineseDay
/// <summary>
/// 農(nóng)歷日
/// </summary>
public int ChineseDay
{
get { return this._cDay; }
}
#endregion
#region ChineseDayString
/// <summary>
/// 農(nóng)歷日中文表示
/// </summary>
public string ChineseDayString
{
get
{
switch (this._cDay)
{
case 0:
return "";
case 10:
return "初十";
case 20:
return "二十";
case 30:
return "三十";
default:
return nStr2[(int)(_cDay / 10)].ToString() + nStr1[_cDay % 10].ToString();
}
}
}
#endregion
#region ChineseMonth
/// <summary>
/// 農(nóng)歷的月份
/// </summary>
public int ChineseMonth
{
get { return this._cMonth; }
}
#endregion
#region ChineseMonthString
/// <summary>
/// 農(nóng)歷月份字符串
/// </summary>
public string ChineseMonthString
{
get
{
return _monthString[this._cMonth];
}
}
#endregion
#region ChineseYear
/// <summary>
/// 取農(nóng)歷年份
/// </summary>
public int ChineseYear
{
get { return this._cYear; }
}
#endregion
#region ChineseYearString
/// <summary>
/// 取農(nóng)歷年字符串如,一九九七年
/// </summary>
public string ChineseYearString
{
get
{
string tempStr = "";
string num = this._cYear.ToString();
for (int i = 0; i < 4; i++)
{
tempStr += ConvertNumToChineseNum(num[i]);
}
return tempStr + "年";
}
}
#endregion
#region ChineseDateString
/// <summary>
/// 取農(nóng)歷日期表示法:農(nóng)歷一九九七年正月初五
/// </summary>
public string ChineseDateString
{
get
{
if (this._cIsLeapMonth == true)
{
return "農(nóng)歷" + ChineseYearString + "閏" + ChineseMonthString + ChineseDayString;
}
else
{
return "農(nóng)歷" + ChineseYearString + ChineseMonthString + ChineseDayString;
}
}
}
#endregion
#region ChineseTwentyFourDay
/// <summary>
/// 定氣法計(jì)算二十四節(jié)氣,二十四節(jié)氣是按地球公轉(zhuǎn)來(lái)計(jì)算的,并非是陰歷計(jì)算的
/// </summary>
/// <remarks>
/// 節(jié)氣的定法有兩種。古代歷法采用的稱為"恒氣",即按時(shí)間把一年等分為24份,
/// 每一節(jié)氣平均得15天有余,所以又稱"平氣"。現(xiàn)代農(nóng)歷采用的稱為"定氣",即
/// 按地球在軌道上的位置為標(biāo)準(zhǔn),一周360°,兩節(jié)氣之間相隔15°。由于冬至?xí)r地
/// 球位于近日點(diǎn)附近,運(yùn)動(dòng)速度較快,因而太陽(yáng)在黃道上移動(dòng)15°的時(shí)間不到15天。
/// 夏至前后的情況正好相反,太陽(yáng)在黃道上移動(dòng)較慢,一個(gè)節(jié)氣達(dá)16天之多。采用
/// 定氣時(shí)可以保證春、秋兩分必然在晝夜平分的那兩天。
/// </remarks>
public string ChineseTwentyFourDay
{
get
{
DateTime baseDateAndTime = new DateTime(1900, 1, 6, 2, 5, 0); //#1/6/1900 2:05:00 AM#
DateTime newDate;
double num;
int y;
string tempStr = "";
y = this._date.Year;
for (int i = 1; i <= 24; i++)
{
num = 525948.76 * (y - 1900) + sTermInfo[i - 1];
newDate = baseDateAndTime.AddMinutes(num);//按分鐘計(jì)算
if (newDate.DayOfYear == _date.DayOfYear)
{
tempStr = SolarTerm[i - 1];
break;
}
}
return tempStr;
}
}
//當(dāng)前日期前一個(gè)最近節(jié)氣
public string ChineseTwentyFourPrevDay
{
get
{
DateTime baseDateAndTime = new DateTime(1900, 1, 6, 2, 5, 0); //#1/6/1900 2:05:00 AM#
DateTime newDate;
double num;
int y;
string tempStr = "";
y = this._date.Year;
for (int i = 24; i >= 1; i--)
{
num = 525948.76 * (y - 1900) + sTermInfo[i - 1];
newDate = baseDateAndTime.AddMinutes(num);//按分鐘計(jì)算
if (newDate.DayOfYear < _date.DayOfYear)
{
tempStr = string.Format("{0}[{1}]", SolarTerm[i - 1], newDate.ToString("yyyy-MM-dd"));
break;
}
}
return tempStr;
}
}
//當(dāng)前日期后一個(gè)最近節(jié)氣
public string ChineseTwentyFourNextDay
{
get
{
DateTime baseDateAndTime = new DateTime(1900, 1, 6, 2, 5, 0); //#1/6/1900 2:05:00 AM#
DateTime newDate;
double num;
int y;
string tempStr = "";
y = this._date.Year;
for (int i = 1; i <= 24; i++)
{
num = 525948.76 * (y - 1900) + sTermInfo[i - 1];
newDate = baseDateAndTime.AddMinutes(num);//按分鐘計(jì)算
if (newDate.DayOfYear > _date.DayOfYear)
{
tempStr = string.Format("{0}[{1}]", SolarTerm[i - 1], newDate.ToString("yyyy-MM-dd"));
break;
}
}
return tempStr;
}
}
#endregion
#endregion
#region 星座
#region Constellation
/// <summary>
/// 計(jì)算指定日期的星座序號(hào)
/// </summary>
/// <returns></returns>
public string Constellation
{
get
{
int index = 0;
int y, m, d;
y = _date.Year;
m = _date.Month;
d = _date.Day;
y = m * 100 + d;
if (((y >= 321) && (y <= 419))) { index = 0; }
else if ((y >= 420) && (y <= 520)) { index = 1; }
else if ((y >= 521) && (y <= 620)) { index = 2; }
else if ((y >= 621) && (y <= 722)) { index = 3; }
else if ((y >= 723) && (y <= 822)) { index = 4; }
else if ((y >= 823) && (y <= 922)) { index = 5; }
else if ((y >= 923) && (y <= 1022)) { index = 6; }
else if ((y >= 1023) && (y <= 1121)) { index = 7; }
else if ((y >= 1122) && (y <= 1221)) { index = 8; }
else if ((y >= 1222) || (y <= 119)) { index = 9; }
else if ((y >= 120) && (y <= 218)) { index = 10; }
else if ((y >= 219) && (y <= 320)) { index = 11; }
else { index = 0; }
return _constellationName[index];
}
}
#endregion
#endregion
#region 屬相
#region Animal
/// <summary>
/// 計(jì)算屬相的索引,注意雖然屬相是以農(nóng)歷年來(lái)區(qū)別的,但是目前在實(shí)際使用中是按公歷來(lái)計(jì)算的
/// 鼠年為1,其它類(lèi)推
/// </summary>
public int Animal
{
get
{
int offset = _date.Year - AnimalStartYear;
return (offset % 12) + 1;
}
}
#endregion
#region AnimalString
/// <summary>
/// 取屬相字符串
/// </summary>
public string AnimalString
{
get
{
int offset = _date.Year - AnimalStartYear; //陽(yáng)歷計(jì)算
//int offset = this._cYear - AnimalStartYear; 農(nóng)歷計(jì)算
return animalStr[offset % 12].ToString();
}
}
#endregion
#endregion
#region 天干地支
#region GanZhiYearString
/// <summary>
/// 取農(nóng)歷年的干支表示法如 乙丑年
/// </summary>
public string GanZhiYearString
{
get
{
string tempStr;
int i = (this._cYear - GanZhiStartYear) % 60; //計(jì)算干支
tempStr = ganStr[i % 10].ToString() + zhiStr[i % 12].ToString() + "年";
return tempStr;
}
}
#endregion
#region GanZhiMonthString
/// <summary>
/// 取干支的月表示字符串,注意農(nóng)歷的閏月不記干支
/// </summary>
public string GanZhiMonthString
{
get
{
//每個(gè)月的地支總是固定的,而且總是從寅月開(kāi)始
int zhiIndex;
string zhi;
if (this._cMonth > 10)
{
zhiIndex = this._cMonth - 10;
}
else
{
zhiIndex = this._cMonth + 2;
}
zhi = zhiStr[zhiIndex - 1].ToString();
//根據(jù)當(dāng)年的干支年的干來(lái)計(jì)算月干的第一個(gè)
int ganIndex = 1;
string gan;
int i = (this._cYear - GanZhiStartYear) % 60; //計(jì)算干支
switch (i % 10)
{
#region ...
case 0: //甲
ganIndex = 3;
break;
case 1: //乙
ganIndex = 5;
break;
case 2: //丙
ganIndex = 7;
break;
case 3: //丁
ganIndex = 9;
break;
case 4: //戊
ganIndex = 1;
break;
case 5: //己
ganIndex = 3;
break;
case 6: //庚
ganIndex = 5;
break;
case 7: //辛
ganIndex = 7;
break;
case 8: //壬
ganIndex = 9;
break;
case 9: //癸
ganIndex = 1;
break;
#endregion
}
gan = ganStr[(ganIndex + this._cMonth - 2) % 10].ToString();
return gan + zhi + "月";
}
}
#endregion
#region GanZhiDayString
/// <summary>
/// 取干支日表示法
/// </summary>
public string GanZhiDayString
{
get
{
int i, offset;
TimeSpan ts = this._date - GanZhiStartDay;
offset = ts.Days;
i = offset % 60;
return ganStr[i % 10].ToString() + zhiStr[i % 12].ToString() + "日";
}
}
#endregion
#region GanZhiDateString
/// <summary>
/// 取當(dāng)前日期的干支表示法如 甲子年乙丑月丙庚日
/// </summary>
public string GanZhiDateString
{
get
{
return GanZhiYearString + GanZhiMonthString + GanZhiDayString;
}
}
#endregion
#endregion
#endregion
#region 方法
#region NextDay
/// <summary>
/// 取下一天
/// </summary>
/// <returns></returns>
public ChineseCalendar NextDay()
{
DateTime nextDay = _date.AddDays(1);
return new ChineseCalendar(nextDay);
}
#endregion
#region PervDay
/// <summary>
/// 取前一天
/// </summary>
/// <returns></returns>
public ChineseCalendar PervDay()
{
DateTime pervDay = _date.AddDays(-1);
return new ChineseCalendar(pervDay);
}
#endregion
#endregion
}
}
調(diào)用:
DateTime dt = DateTime.Now;
ChineseCalendar cc = new ChineseCalendar(dt);
Console.WriteLine("陽(yáng)歷:" + cc.DateString);
Console.WriteLine("屬相:" + cc.AnimalString);
Console.WriteLine("農(nóng)歷:" + cc.ChineseDateString);
Console.WriteLine("時(shí)辰:" + cc.ChineseHour);
Console.WriteLine("節(jié)氣:" + cc.ChineseTwentyFourDay);
Console.WriteLine("節(jié)日:" + cc.DateHoliday);
Console.WriteLine("前一個(gè)節(jié)氣:" + cc.ChineseTwentyFourPrevDay);
Console.WriteLine("后一個(gè)節(jié)氣:" + cc.ChineseTwentyFourNextDay);
Console.WriteLine("干支:" + cc.GanZhiDateString);
Console.WriteLine("星期:" + cc.WeekDayStr);
Console.WriteLine("星宿:" + cc.ChineseConstellation);
Console.WriteLine("星座:" + cc.Constellation);
結(jié)果:
陽(yáng)歷:公元2013年1月27日
屬相:蛇
農(nóng)歷:農(nóng)歷二零一二年臘月十六
時(shí)辰:庚申
節(jié)氣:
節(jié)日:
前一個(gè)節(jié)氣:大寒[2013-01-20]
后一個(gè)節(jié)氣:立春[2013-02-03]
干支:壬辰年癸丑月癸巳日
星期:星期日
星宿:房日兔
星座:水瓶座
- C++算法系列之日歷生成的算法代碼
- 很全的顯示陰歷(農(nóng)歷)日期的js代碼
- 顯示今天的日期js代碼(陽(yáng)歷和農(nóng)歷)
- 獲取陰歷(農(nóng)歷)和當(dāng)前日期的js代碼
- php下實(shí)現(xiàn)農(nóng)歷日歷的代碼
- php 陰歷-農(nóng)歷-轉(zhuǎn)換類(lèi)代碼
- JS獲取農(nóng)歷日期具體實(shí)例
- python實(shí)現(xiàn)的陽(yáng)歷轉(zhuǎn)陰歷(農(nóng)歷)算法
- javascript實(shí)現(xiàn)帶節(jié)日和農(nóng)歷的日歷特效
- Javascript獲取當(dāng)前日期的農(nóng)歷日期代碼
- C++算法系列之中國(guó)農(nóng)歷的算法
相關(guān)文章
支持多類(lèi)型數(shù)據(jù)庫(kù)的c#數(shù)據(jù)庫(kù)模型示例
本文為大家提供一個(gè)c#數(shù)據(jù)庫(kù)訪問(wèn)模型,支持多類(lèi)型數(shù)據(jù)庫(kù),簡(jiǎn)單抽取數(shù)據(jù)庫(kù)訪問(wèn)函數(shù),大家參考使用吧2014-01-01相對(duì)路徑和絕對(duì)路徑的寫(xiě)法總結(jié)
本文主要對(duì)相對(duì)路徑和絕對(duì)路徑的寫(xiě)法進(jìn)行總結(jié)。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01初步認(rèn)識(shí)C#中的Lambda表達(dá)式和匿名方法
這篇文章主要介紹了初步認(rèn)識(shí)C#中的Lambda表達(dá)式和匿名方法,本文著重講解Lambda表達(dá)式和匿名方法的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-01-01DataGridView清除顯示的數(shù)據(jù)、設(shè)定右鍵菜單
這篇文章介紹了DataGridView清除顯示的數(shù)據(jù)、設(shè)定右鍵菜單的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02優(yōu)雅又實(shí)用的C#代碼優(yōu)化技巧分享
這篇文章主要為大家整理了一些優(yōu)雅又實(shí)用的C#代碼優(yōu)化技巧,文中的示例代碼講解詳細(xì),對(duì)我們深入了解C#有一定的幫助,需要的可以參考一下2023-06-06輸出的文本實(shí)現(xiàn)對(duì)齊的方法(超簡(jiǎn)單)
下面小編就為大家分享一篇c#輸出的文本實(shí)現(xiàn)對(duì)齊的方法,特別簡(jiǎn)單!希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12