VB.NET的阳历与农历转换的算法

Posted on 2005-09-07 14:56  VisionSpace  阅读(1098)  评论(0)    收藏  举报
   '下面是一个关于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日。


   
Function GetChgDate(ByVal vDate As StringByVal ChgType As 转换方式) As String

        
Dim vvdate() As String = Split(vDate, "-")

 

        
If vvdate(0> 2011 Or vvdate(0< 1900 Then

            
Throw New NotSupportedException("本函数只提供1900年至2011年的日历转换!")

        
End If

 

        
Dim AddMonth, AddDay, AddYear, getDay, i As Integer

        
Dim RunYue As Boolean

        
Dim conDate As DateTime

 

        
Dim daList(2011As String

        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 = vvdate(0)

 

        
If ChgType = 转换方式.阴历转阳历 Then

            AddMonth 
= Val(Mid(daList(AddYear), 152))

            AddDay 
= Val(Mid(daList(AddYear), 172))

            conDate 
= DateSerial(AddYear, AddMonth, AddDay)

            AddDay 
= vvdate(2)

            
For i = 1 To vvdate(1- 1

                AddDay 
= AddDay + 29 + Val(Mid(daList(vvdate(0)), i, 1))

            
Next i

            
Return DateAdd(DateInterval.Day, AddDay - 1, conDate)

        
Else

CHUSHIHUA:

            AddMonth 
= Val(Mid(daList(AddYear), 152))

            AddDay 
= Val(Mid(daList(AddYear), 172))

            conDate 
= DateSerial(AddYear, AddMonth, AddDay)

            
Dim vtDate As DateTime

            
Try

                vtDate 
= CType(vDate, DateTime)

            
Catch ex As Exception

                
Throw New NotSupportedException("阳历日期输入错误!")

            
End Try

 

 

            getDay 
= DateDiff(DateInterval.Day, conDate, vtDate)

            
If getDay < 0 Then AddYear = AddYear - 1 : GoTo CHUSHIHUA

            AddDay 
= 1

            AddMonth 
= 1

            
For i = 1 To getDay

                AddDay 
= AddDay + 1

                
If AddDay = 30 + Mid(daList(AddYear), AddMonth, 1Or (RunYue And AddDay = 30 + Mid(daList(AddYear), 131)) Then

                    
If RunYue = False And AddMonth = Val("&H" & Mid(daList(AddYear), 141)) Then

                        RunYue 
= True

                    
Else

                        RunYue 
= False

                        AddMonth 
= AddMonth + 1

                    
End If

                    AddDay 
= 1

                
End If

 

            
Next

            
Return AddYear & "-" & AddMonth & "-" & AddDay

        
End If

 

    
End Function


 

    
Enum 转换方式

        阴历转阳历 
= 1

        阳历转阴历 
= 0

    
End Enum


博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3