'下面是一个关于VB的农历算法 '日期数据定义方法如下 '前12个字节代表1-12月为大月或是小月,1为大月30天,0为小月29天, '第13位为闰月的情况,1为大月30天,0为小月29天,第14位为闰月的月 '份,如果不是闰月为0,否则给出月份,10、11、12分别用A、B、C来表 '示,即使用16进制。最后4位为当年家农历新年-即农历1月1日所在公历 '的日期,如0131代表1月31日。 'GetYLDate函数使用方式如下tYear为要输入的年,tMonth为月,tDay为 '日期,YLyear是返回值,返加农历的年份,如甲子年,YLShuXing返回 '的是属象,如鼠。IsGetGl是设置是不是通过农历取公历值,如果是, '前三个返回相应的公历日期,而且返回值是一个公历日期。 Function GetYLDate(tYear As Integer,tMonth As Integer,tDay As Integer,_ YLyear As String,YLShuXing As String,_ Optional IsGetGl As Boolean) As String On Error Resume Next Dim dalist(1900 To 2011) As String * 18 Dim conDate As Date,setDate As Date Dim AddMonth As Integer,AddDay As Integer,AddYear As Integer,getDay As Integer Dim RunYue As Boolean If tYear > 2010 Or tYear < 1901 Then Exit Function '如果不是有效有日期,退出 '1900 to 1909 dalist(1900) = "010010110110180131" dalist(1901) = "010010101110000219" dalist(1902) = "101001010111000208" dalist(1903) = "010100100110150129" dalist(1904) = "110100100110000216" dalist(1905) = "110110010101000204" dalist(1906) = "011010101010140125" dalist(1907) = "010101101010000213" dalist(1908) = "100110101101000202" dalist(1909) = "010010101110120122" dalist(1910) = "010010101110000210" dalist(1911) = "101001001101160130" dalist(1912) = "101001001101000218" dalist(1913) = "110100100101000206" dalist(1914) = "110101010100150126" dalist(1915) = "101101010101000214" dalist(1916) = "010101101010000204" dalist(1917) = "100101101101020123" dalist(1918) = "100101011011000211" dalist(1919) = "010010011011170201" dalist(1920) = "010010011011000220" dalist(1921) = "101001001011000208" dalist(1922) = "101100100101150128" dalist(1923) = "011010100101000216" dalist(1924) = "011011010100000205" dalist(1925) = "101011011010140124" dalist(1926) = "001010110110000213" dalist(1927) = "100101010111000202" dalist(1928) = "010010010111120123" dalist(1929) = "010010010111000210" dalist(1930) = "011001001011060130" dalist(1931) = "110101001010000217" dalist(1932) = "111010100101000206" dalist(1933) = "011011010100150126" dalist(1934) = "010110101101000214" dalist(1935) = "001010110110000204" dalist(1936) = "100100110111030124" dalist(1937) = "100100101110000211" dalist(1938) = "110010010110170131" dalist(1939) = "110010010101000219" dalist(1940) = "110101001010000208" dalist(1941) = "110110100101060127" dalist(1942) = "101101010101000215" dalist(1943) = "010101101010000205" dalist(1944) = "101010101101140125" dalist(1945) = "001001011101000213" dalist(1946) = "100100101101000202" dalist(1947) = "110010010101120122" dalist(1948) = "101010010101000210" dalist(1949) = "101101001010170129" dalist(1950) = "011011001010000217" dalist(1951) = "101101010101000206" dalist(1952) = "010101011010150127" dalist(1953) = "010011011010000214" dalist(1954) = "101001011011000203" dalist(1955) = "010100101011130124" dalist(1956) = "010100101011000212" dalist(1957) = "101010010101080131" dalist(1958) = "111010010101000218" dalist(1959) = "011010101010000208" dalist(1960) = "101011010101060128" dalist(1961) = "101010110101000215" dalist(1962) = "010010110110000205" dalist(1963) = "101001010111040125" dalist(1964) = "101001010111000213" dalist(1965) = "010100100110000202" dalist(1966) = "111010010011030121" dalist(1967) = "110110010101000209" dalist(1968) = "010110101010170130" dalist(1969) = "010101101010000217" dalist(1970) = "100101101101000206" dalist(1971) = "010010101110150127" dalist(1972) = "010010101101000215" dalist(1973) = "101001001101000203" dalist(1974) = "110100100110140123" dalist(1975) = "110100100101000211" dalist(1976) = "110101010010180131" dalist(1977) = "101101010100000218" dalist(1978) = "101101101010000207" dalist(1979) = "100101101101060128" dalist(1980) = "100101011011000216" dalist(1981) = "010010011011000205" dalist(1982) = "101001001011140125" dalist(1983) = "101001001011000213" dalist(1984) = "1011001001011A0202" dalist(1985) = "011010100101000220" dalist(1986) = "011011010100000209" dalist(1987) = "101011011010060129" dalist(1988) = "101010110110000217" dalist(1989) = "100100110111000206" dalist(1990) = "010010010111150127" dalist(1991) = "010010010111000215" dalist(1992) = "011001001011000204" dalist(1993) = "011010100101030123" dalist(1994) = "111010100101000210" dalist(1995) = "011010110010180131" dalist(1996) = "010110101100000219" dalist(1997) = "101010110110000207" dalist(1998) = "100100110110150128" dalist(1999) = "100100101110000216" dalist(2000) = "110010010110000205" dalist(2001) = "110101001010140124" dalist(2002) = "110101001010000212" dalist(2003) = "110110100101000201" dalist(2004) = "010110101010120122" dalist(2005) = "010101101010000209" dalist(2006) = "101010101101170129" dalist(2007) = "001001011101000218" dalist(2008) = "100100101101000207" dalist(2009) = "110010010101150126" dalist(2010) = "101010010101000214" dalist(2011) = "101101001010000214" AddYear = tYear RunYue = False If IsGetGl Then AddMonth = Val(Mid(dalist(AddYear),15,2)) AddDay = Val(Mid(dalist(AddYear),17,2)) conDate = DateSerial(AddYear,AddMonth,AddDay) AddDay = tDay For i = 1 To tMonth - 1 AddDay = AddDay + 29 + Val(Mid(dalist(tYear),i,1)) Next i 'MsgBox DateDiff("d",conDate,Date) setDate = DateAdd("d",AddDay - 1,conDate) GetYLDate = setDate tYear = Year(setDate) tMonth = Month(setDate) tDay = Day(setDate) Exit Function End If CHUSHIHUA: AddMonth = Val(Mid(dalist(AddYear),2)) AddDay = Val(Mid(dalist(AddYear),2)) conDate = DateSerial(AddYear,AddDay) setDate = DateSerial(tYear,tMonth,tDay) getDay = DateDiff("d",setDate) If getDay < 0 Then AddYear = AddYear - 1: GoTo CHUSHIHUA ' addday = NearDay AddDay = 1: AddMonth = 1 For i = 1 To getDay AddDay = AddDay + 1 If AddDay = 30 + Mid(dalist(AddYear),1) Or (RunYue And AddDay = 30 + Mid(dalist(AddYear),13,1)) Then If RunYue = False And AddMonth = Val("&H" & Mid(dalist(AddYear),14,1)) Then RunYue = True Else RunYue = False AddMonth = AddMonth + 1 End If AddDay = 1 End If Next md$ = "初一初二初三初四初五初六初七初八初九初十十一十二十三十四十五十六十七十八十九二十廿一廿二廿三廿四廿五廿六廿七廿八廿九三十" dd$ = Mid(md$,(AddDay - 1) * 2 + 1,2) mm$ = Mid("正二三四五六七八九十寒腊",1) + "月" YouGetDate = DateSerial(AddYear,AddDay) tiangan$ = "甲乙丙丁戊已庚辛壬癸" dizhi$ = "子丑寅卯辰巳午未申酉戌亥" Dim ganzhi(0 To 59) As String * 2 For i = 0 To 59 ganzhi(i) = Mid(tiangan$,(i Mod 10) + 1,1) + Mid(dizhi$,(i Mod 12) + 1,1) 'ff$ = ff$ + ganzhi(i) Next i 'MsgBox ff$,Len(ff$) YLyear = ganzhi((AddYear - 4) Mod 60) shu$ = "鼠牛虎兔龙蛇马羊猴鸡狗猪" YLShuXing = Mid(shu$,((AddYear - 4) Mod 12) + 1,1) If RunYue Then mm$ = "闰" + mm$ GetYLDate = mm$ + dd$ End Function
http://www.cx66.com/cxgzs/program/vb/953.htm