基于组件的C#农历算法
/**
*日期数据定义方法如下:
*前12个字节代表1-12月为大月或是小月,1为大月30天,0为小月29天,
*第13位为闰月的情况,1为大月30天,0为小月29天,第14、15位为闰月的月份,
*使用10进制表示。最后4位为当年家农历新年-即农历1月1日所在公历的日期,
*如0131代表1月31日。日期函数使用方式如下i公历年为要输入的公历年,i公历月为
*公历月,i公历日为公历日,返回值为:属相 ,天干地支,农历年农历月农历日。
**/
完整代码如下:
using System;
using System.Collections.Generic;
using System.Text;
namespace CHCalendar
{
#region(公历转农历类 J.X.F 2005.03.23)
class CHCalendar
{
private string[] m_strNLRLB;
private string[] m_strTGDZB;
private string m_strSXB;
private string m_strNLYB;
private string m_strNLRB;
private int m_strMaxGLNF;
private int m_strMinGLNF;
public CHCalendar()
{
//111年中的农历日历表
m_strNLRLB = new string[] {
"0100101101101080131","0100101011100000219",
"1010010101110000208","0101001001101050129",
"1101001001100000216","1101100101010000204",
"0110101010101040125","0101011010100000213",
"1001101011010000202","0100101011101020122",
"0100101011100000210","1010010011011060130",
"1010010011010000218","1101001001010000206",
"1101010101001050126","1011010101010000214",
"0101011010100000204","1001011011010020123",
"1001010110110000211","0100100110111070201",
"0100100110110000220","1010010010110000208",
"1011001001011050128","0110101001010000216",
"0110110101000000205","1010110110101040124",
"0010101101100000213","1001010101110000202",
"0100100101111020123","0100100101110000210",
"0110010010110060130","1101010010100000217",
"1110101001010000206","0110110101001050126",
"0101101011010000214","0010101101100000204",
"1001001101110030124","1001001011100000211",
"1100100101101070131","1100100101010000219",
"1101010010100000208","1101101001010060127",
"1011010101010000215","0101011010100000205",
"1010101011011040125","0010010111010000213",
"1001001011010000202","1100100101011020122",
"1010100101010000210","1011010010101070129",
"0110110010100000217","1011010101010000206",
"0101010110101050127","0100110110100000214",
"1010010110110000203","0101001010111030124",
"0101001010110000212","1010100101010080131",
"1110100101010000218","0110101010100000208",
"1010110101010060128","1010101101010000215",
"0100101101100000205","1010010101110040125",
"1010010101110000213","0101001001100000202",
"1110100100110030121","1101100101010000209",
"0101101010101070130","0101011010100000217",
"1001011011010000206","0100101011101050127",
"0100101011010000215","1010010011010000203",
"1101001001101040123","1101001001010000211",
"1101010100101080131","1011010101000000218",
"1011011010100000207","1001011011010060128",
"1001010110110000216","0100100110110000205",
"1010010010111040125","1010010010110000213",
"1011001001011100202","0110101001010000220",
"0110110101000000209","1010110110101060129",
"1010101101100000217","1001001101110000206",
"0100100101111050127","0100100101110000215",
"0110010010110000204","0110101001010030123",
"1110101001010000210","0110101100101080131",
"0101101011000000219","1010101101100000207",
"1001001101101050128","1001001011100000216",
"1100100101100000205","1101010010101040124",
"1101010010100000212","1101101001010000201",
"0101101010101020122","0101011010100000209",
"1010101011011070129","0010010111010000218",
"1001001011010000207","1100100101011050126",
"1010100101010000214","1011010010100000214"
};
m_strSXB = "鼠牛虎兔龙蛇马羊猴鸡狗猪";
m_strNLYB = "正二三四五六七八九十寒腊";
m_strNLRB = "初一初二初三初四初五初六初七初八初九初十十一十二十三十四十五十六十七十八十九二十廿一廿二廿三廿四廿五廿六廿七廿八廿九三十";
m_strMaxGLNF = 2011;
m_strMinGLNF = 1900;
string m_strTG = "甲乙丙丁戊已庚辛壬癸";
string m_strDZ = "子丑寅卯辰巳午未申酉戌亥";
m_strTGDZB = new string[60];
for (int i = 0; i < 60; i++)
{
m_strTGDZB = m_strTG.Substring(i % 10, 1) + m_strDZ.Substring(i % 12, 1);
}
}
//返回农历日期格式的字符串
//传参为公历年、月、日
public string sDate(int iGLN,int iGLY,int iGLR)
{
if ((iGLN < m_strMinGLNF) || (iGLN > m_strMaxGLNF))
{ //如果不是有效公历sDate,退出。
return "无效公历年份";
}
// 计算农历年
int iNLN;
int iNLY;
int iNLR;
iNLN = iGLN;
// 农历新年月份
iNLY = Convert.ToInt32((m_strNLRLB[iNLN - m_strMinGLNF].Substring(15, 2)));
// 农历新年日子
iNLR = Convert.ToInt32((m_strNLRLB[iNLN - m_strMinGLNF].Substring(17, 2))); ;
if ((iGLY < iNLY) || ((iGLY == iNLY) && (iGLR < iNLR)))
{
iNLN--;
// 农历新年月份
iNLY = Convert.ToInt32((m_strNLRLB[iNLN - m_strMinGLNF].Substring(15, 2)));
// 农历新年日子
iNLR = Convert.ToInt32((m_strNLRLB[iNLN - m_strMinGLNF].Substring(17, 2))); ;
}
// 计算农历月
DateTime dtGLsDate = new DateTime(iGLN, iGLY, iGLR);
DateTime dtNLsDate = new DateTime(iNLN, iNLY, iNLR);
TimeSpan tssDateBalance = dtGLsDate - dtNLsDate;
int iDays = tssDateBalance.Days;
iNLY = 1;
iNLR = 1;
bool bYunYue = false;
for (int i = 0; i < iDays; i++)
{
iNLR++;
if (iNLR == 30 + Convert.ToInt32(m_strNLRLB[iNLN - m_strMinGLNF].Substring(iNLY - 1, 1)) ||
(bYunYue && (iNLR == 30 + Convert.ToInt32(m_strNLRLB[iNLN - m_strMinGLNF].Substring(12, 1)))))
{
if ((bYunYue == false) && (iNLY == Convert.ToInt32(m_strNLRLB[iNLN - m_strMinGLNF].Substring(13, 2))))
{
bYunYue = true;
}
else
{
bYunYue = false;
iNLY++;
}
iNLR = 1;
}
else
{
}
}
// 计算农历日
string strNLR = m_strNLRB.Substring((iNLR - 1) * 2, 2);
// 计算农历月
string strNLY = m_strNLYB.Substring(iNLY - 1, 1) + "月";
if (bYunYue)
{
strNLY = "闰" + strNLY;
}
// 农历年
string strNLN = Convert.ToString(iNLN, 10) + "年";
// 计算天干地支
string m_strTGDZ = m_strTGDZB[(iNLN - 4) % 60];
// 计算属相
string strSX = m_strSXB.Substring((iNLN - 4) % 12, 1);
// 返回农历sDate
return strSX + "," + m_strTGDZ + "," + strNLN + strNLY + strNLR;
}
}
#endregion
}