正确计算天干地支生肖的函数(.net)---更正版

来源:互联网 发布:fc2最新域名官方 编辑:程序博客网 时间:2024/04/28 02:20
因为要用到一个 算干支的函数
但在网上找了好长时间,没有发现算的正确的(按春节划分如20070217丙戌-20070218则为丁亥)
所以就自写了一个,夜深了,有的地方就草草写了,有错请回复提出

注:
用的XML数据库,有兴趣的朋友可以将之转为其它数据库
如果大家需要的话我可以把文件打个包。
 -----邹健
====================================================
后注:愿来的函数没做时间合法性判断,又重新修正更改了


因为我用的是ASP.net所以要调用的XML文件名直接写在了web.config的appSettings
代码如下
目录结构
/App_code/strcl.vb本类库文件
|
/xml/AnimalSign.xml    十二生肖及地支文件
|        Date.xml                  1900-2100春节时间
|          SkyTree.xml          天干列表
|
/web.config 网站配置文件

本文将按以下顺序给出代码
datecl.vb
web.config
Date.xml
AnimalSign.xml
SkyTree.xml

=====================================datecl.vb=================================
Imports Microsoft.VisualBasic
Public Class Datecl
    
Public Enum SkyTreeText
        天干 
= 0
        地支 
= 1
    
End Enum
    
Shared Function ftime(ByRef d As DateTime) As String
        
If DateDiff(DateInterval.Day, d, Now()) >= 1 Then
            
Return Format(d, "MM-dd")
        
Else
            
Return Format(d, "HH:mm")
        
End If
    
End Function
    
Overloads Shared Function SkyTree(ByRef dat As DateTime, ByRef i As SkyTreeText) As Byte
        
'得到干支序号
        Dim Dom As New System.Xml.XmlDocument
        Dom.Load(My.Request.MapPath(
"/"& ConfigurationManager.AppSettings("AnimalSignDate"))
        
Dim Node As System.Xml.XmlNode
        
Dim y As Int16 = Int16.Parse(Year(dat))
        
Dim m As Byte = Byte.Parse(Month(dat))
        
Dim d As Byte = Byte.Parse(Day(dat))
        Node 
= Dom.SelectSingleNode("//item[@year=" & y & "]")
        
Dim start As Int16
        
Dim n As Byte
        
Dim result As Byte
        
If i = 1 Then
            start 
= 1901
            n 
= 12
        
Else
            start 
= 1905
            n 
= 10
        
End If
        result 
= ((y - start) Mod n) + 2
        result 
= IIf(result <= 0, result + n, result)
        
If Byte.Parse(Node.Attributes("month").InnerXml) > m Then result = result - 1
        
If Byte.Parse(Node.Attributes("month").InnerXml) = m And Byte.Parse(Node.Attributes("day").InnerXml) > d Then result = result - 1
        result 
= IIf(result = 0, n, result)
        result 
= IIf(result = n + 11, result)
        
Return result
        
'本最多用时16MS一般1MS内可以完成
    End Function
    
Overloads Shared Function SkyTree(ByRef dats As StringByRef i As SkyTreeText) As Byte '得到干支序号
        If Not IsDate(dats) Then Return 0
        
Return SkyTree(DateTime.Parse(dats), i)
    
End Function
    
Shared Function XmlItemName(ByRef Xpath As StringByRef name As StringByRef xmlfilename As StringAs String '通用读取XML
        Dim Dom As New System.Xml.XmlDocument
        Dom.Load(My.Request.MapPath(
"/"& ConfigurationManager.AppSettings(xmlfilename))
        
Dim Node As System.Xml.XmlNode
        Node 
= Dom.SelectSingleNode(Xpath)
        
Return Node.Attributes(name).InnerXml
    
End Function
    
Overloads Shared Function AnimalSignName(ByRef Num As ByteAs String '返回生肖名
        Return XmlItemName("//item[@id=" & Num.ToString & "]""name""AnimalSign")
    
End Function
    
Overloads Shared Function AnimalSignName(ByRef dat As DateTime) As String '返回生肖名
        Return AnimalSignName(SkyTree(dat, SkyTreeText.地支))
    
End Function
    
Overloads Shared Function AnimalSignName(ByRef dats As StringAs String '返回生肖名
        If Not IsDate(dats) Then Return ""
        
Return AnimalSignName(SkyTree(DateTime.Parse(dats), SkyTreeText.地支))
    
End Function

    
Overloads Shared Function TreeName(ByRef dat As DateTime) As String '返回为地支名
        Return XmlItemName("//item[@id=" & SkyTree(dat, SkyTreeText.地支) & "]""tree""AnimalSign")
    
End Function
    
Overloads Shared Function TreeName(ByRef dats As StringAs String '返回为地支名
        If Not IsDate(dats) Then Return ""
        
Return TreeName(DateTime.Parse(dats))
    
End Function
    
Overloads Shared Function SkyName(ByRef dat As DateTime) As String '返回天干名
        Return XmlItemName("//item[@id=" & SkyTree(dat, SkyTreeText.天干).ToString & "]""tree""SkyTree")
    
End Function
    
Overloads Shared Function SkyName(ByRef dats As StringAs String '返回天干名
        If Not IsDate(dats) Then Return ""
        
Return SkyName(DateTime.Parse(dats))
    
End Function
    
Overloads Shared Function SkyTreeName(ByRef dat As DateTime) As String '返回天干地支
        Return SkyName(dat) & TreeName(dat)
    
End Function
    
Overloads Shared Function SkyTreeName(ByRef dats As StringAs String '返回天干地支
        Return SkyName(dats) & TreeName(dats)
    
End Function
    
Overloads Shared Function StarSignName(ByRef dats As StringAs String
        
Return StarSignName(StarSign(dats))
    
End Function
    
Overloads Shared Function StarSignName(ByRef dat As DateTime) As String
        
Return StarSignName(StarSign(dat))
    
End Function
    
Overloads Shared Function StarSignName(ByRef Num As ByteAs String
        
Return XmlItemName("/root/item[@id=" & Num.ToString & "]""name""StarSign")
    
End Function
    
Shared Function StarSign(ByRef dats As StringAs Byte
        
If Not IsDate(dats) Then Return 0
        
Return StarSign(DateTime.Parse(dats))
    
End Function
    
Shared Function StarSign(ByRef dat As DateTime) As Byte
        
If Not IsDate(dat) Then Return 0
        
Dim m As Byte = Byte.Parse(Month(dat))
        
Dim d As Byte = Byte.Parse(Day(dat))
        
Dim y As Int16 = 2007
        
Dim temp As DateTime = DateTime.Parse(m & "/" & d & "/2007")
        
Select Case temp
            
Case #3/21/2007To #4/19/2007#
                StarSign 
= 1
            
Case #4/20/2007To #5/20/2007#
                StarSign 
= 2
            
Case #5/21/2007To #6/21/2007#
                StarSign 
= 3
            
Case #6/22/2007To #7/22/2007#
                StarSign 
= 4
            
Case #7/23/2007To #8/22/2007#
                StarSign 
= 5
            
Case #8/23/2007To #9/22/2007#
                StarSign 
= 6
            
Case #9/23/2007To #10/23/2007#
                StarSign 
= 7
            
Case #10/24/2007To #11/21/2007#
                StarSign 
= 8
            
Case #11/22/2007To #12/21/2007#
                StarSign 
= 9
            
Case #12/22/2007To #12/31/2007#
                StarSign 
= 10
            
Case #1/1/2007To #1/19/2007#
                StarSign 
= 10
            
Case #1/20/2007To #2/18/2007#
                StarSign 
= 11
            
Case #2/19/2007To #3/20/2007#
                StarSign 
= 12
            
Case Else
                StarSign 
= 0
        
End Select
        
Return StarSign
    
End Function
End Class

==============web.config中加以下结点
<appSettings>
        
<add key="AnimalSignDate" value="/Xml/Date.xml"/>
        
<add key="AnimalSign" value="/Xml/AnimalSign.xml"/>
        
<add key="StarSign" value="/Xml/StarSign.xml"/>
                
<add key="SkyTree" value="/Xml/SkyTree.xml"/>
</appSettings>

==============Date.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
<item month="1" day="31" year="1900" />
<item month="2" day="19" year="1901" />
<item month="2" day="8" year="1902" />
<item month="1" day="29" year="1903" />
<item month="2" day="16" year="1904" />
<item month="2" day="4" year="1905" />
<item month="1" day="25" year="1906" />
<item month="2" day="13" year="1907" />
<item month="2" day="2" year="1908" />
<item month="1" day="22" year="1909" />
<item month="2" day="10" year="1910" />
<item month="1" day="30" year="1911" />
<item month="2" day="18" year="1912" />
<item month="2" day="6" year="1913" />
<item month="1" day="26" year="1914" />
<item month="2" day="14" year="1915" />
<item month="2" day="4" year="1916" />
<item month="1" day="23" year="1917" />
<item month="2" day="11" year="1918" />
<item month="2" day="1" year="1919" />
<item month="2" day="20" year="1920" />
<item month="2" day="8" year="1921" />
<item month="1" day="28" year="1922" />
<item month="2" day="16" year="1923" />
<item month="2" day="5" year="1924" />
<item month="1" day="24" year="1925" />
<item month="2" day="13" year="1926" />
<item month="2" day="2" year="1927" />
<item month="1" day="23" year="1928" />
<item month="2" day="10" year="1929" />
<item month="1" day="30" year="1930" />
<item month="2" day="17" year="1931" />
<item month="2" day="6" year="1932" />
<item month="1" day="26" year="1933" />
<item month="2" day="14" year="1934" />
<item month="2" day="4" year="1935" />
<item month="1" day="24" year="1936" />
<item month="2" day="11" year="1937" />
<item month="1" day="31" year="1938" />
<item month="2" day="19" year="1939" />
<item month="2" day="8" year="1940" />
<item month="1" day="27" year="1941" />
<item month="2" day="15" year="1942" />
<item month="2" day="5" year="1943" />
<item month="1" day="25" year="1944" />
<item month="2" day="13" year="1945" />
<item month="2" day="2" year="1946" />
<item month="1" day="22" year="1947" />
<item month="2" day="10" year="1948" />
<item month="1" day="29" year="1949" />
<item month="2" day="17" year="1950" />
<item month="2" day="6" year="1951" />
<item month="1" day="27" year="1952" />
<item month="2" day="14" year="1953" />
<item month="2" day="3" year="1954" />
<item month="1" day="24" year="1955" />
<item month="2" day="12" year="1956" />
<item month="1" day="31" year="1957" />
<item month="2" day="18" year="1958" />
<item month="2" day="8" year="1959" />
<item month="1" day="28" year="1960" />
<item month="2" day="15" year="1961" />
<item month="2" day="5" year="1962" />
<item month="1" day="25" year="1963" />
<item month="2" day="13" year="1964" />
<item month="2" day="2" year="1965" />
<item month="1" day="21" year="1966" />
<item month="2" day="9" year="1967" />
<item month="1" day="30" year="1968" />
<item month="2" day="17" year="1969" />
<item month="2" day="6" year="1970" />
<item month="1" day="27" year="1971" />
<item month="2" day="15" year="1972" />
<item month="2" day="3" year="1973" />
<item month="1" day="23" year="1974" />
<item month="2" day="11" year="1975" />
<item month="1" day="31" year="1976" />
<item month="2" day="18" year="1977" />
<item month="2" day="7" year="1978" />
<item month="1" day="28" year="1979" />
<item month="2" day="16" year="1980" />
<item month="2" day="5" year="1981" />
<item month="1" day="25" year="1982" />
<item month="2" day="13" year="1983" />
<item month="2" day="2" year="1984" />
<item month="2" day="20" year="1985" />
<item month="2" day="9" year="1986" />
<item month="1" day="29" year="1987" />
<item month="2" day="17" year="1988" />
<item month="2" day="6" year="1989" />
<item month="1" day="27" year="1990" />
<item month="2" day="15" year="1991" />
<item month="2" day="4" year="1992" />
<item month="1" day="23" year="1993" />
<item month="2" day="10" year="1994" />
<item month="1" day="31" year="1995" />
<item month="2" day="19" year="1996" />
<item month="2" day="7" year="1997" />
<item month="1" day="28" year="1998" />
<item month="2" day="16" year="1999" />
<item month="2" day="5" year="2000" />
<item month="1" day="24" year="2001" />
<item month="2" day="12" year="2002" />
<item month="2" day="1" year="2003" />
<item month="1" day="22" year="2004" />
<item month="2" day="9" year="2005" />
<item month="1" day="29" year="2006" />
<item month="2" day="18" year="2007" />
<item month="2" day="7" year="2008" />
<item month="1" day="26" year="2009" />
<item month="2" day="14" year="2010" />
<item month="2" day="3" year="2011" />
<item month="1" day="23" year="2012" />
<item month="2" day="10" year="2013" />
<item month="1" day="31" year="2014" />
<item month="2" day="19" year="2015" />
<item month="2" day="8" year="2016" />
<item month="1" day="28" year="2017" />
<item month="2" day="16" year="2018" />
<item month="2" day="5" year="2019" />
<item month="1" day="25" year="2020" />
<item month="2" day="12" year="2021" />
<item month="2" day="1" year="2022" />
<item month="1" day="22" year="2023" />
<item month="2" day="10" year="2024" />
<item month="1" day="29" year="2025" />
<item month="2" day="17" year="2026" />
<item month="2" day="6" year="2027" />
<item month="1" day="26" year="2028" />
<item month="2" day="13" year="2029" />
<item month="2" day="3" year="2030" />
<item month="1" day="23" year="2031" />
<item month="2" day="11" year="2032" />
<item month="1" day="31" year="2033" />
<item month="2" day="19" year="2034" />
<item month="2" day="8" year="2035" />
<item month="1" day="28" year="2036" />
<item month="2" day="15" year="2037" />
<item month="2" day="4" year="2038" />
<item month="1" day="24" year="2039" />
<item month="2" day="12" year="2040" />
<item month="2" day="1" year="2041" />
<item month="1" day="22" year="2042" />
<item month="2" day="10" year="2043" />
<item month="1" day="30" year="2044" />
<item month="2" day="17" year="2045" />
<item month="2" day="6" year="2046" />
<item month="1" day="26" year="2047" />
<item month="2" day="14" year="2048" />
<item month="2" day="2" year="2049" />
<item month="1" day="23" year="2050" />
<item month="2" day="11" year="2051" />
<item month="2" day="1" year="2052" />
<item month="2" day="19" year="2053" />
<item month="2" day="8" year="2054" />
<item month="1" day="28" year="2055" />
<item month="2" day="15" year="2056" />
<item month="2" day="4" year="2057" />
<item month="1" day="24" year="2058" />
<item month="2" day="12" year="2059" />
<item month="2" day="2" year="2060" />
<item month="1" day="21" year="2061" />
<item month="2" day="9" year="2062" />
<item month="1" day="29" year="2063" />
<item month="2" day="17" year="2064" />
<item month="2" day="5" year="2065" />
<item month="1" day="26" year="2066" />
<item month="2" day="14" year="2067" />
<item month="2" day="3" year="2068" />
<item month="1" day="23" year="2069" />
<item month="2" day="11" year="2070" />
<item month="1" day="31" year="2071" />
<item month="2" day="19" year="2072" />
<item month="2" day="7" year="2073" />
<item month="1" day="27" year="2074" />
<item month="2" day="15" year="2075" />
<item month="2" day="5" year="2076" />
<item month="1" day="24" year="2077" />
<item month="2" day="12" year="2078" />
<item month="2" day="2" year="2079" />
<item month="1" day="22" year="2080" />
<item month="2" day="9" year="2081" />
<item month="1" day="29" year="2082" />
<item month="2" day="17" year="2083" />
<item month="2" day="6" year="2084" />
<item month="1" day="26" year="2085" />
<item month="2" day="14" year="2086" />
<item month="2" day="3" year="2087" />
<item month="1" day="24" year="2088" />
<item month="2" day="10" year="2089" />
<item month="1" day="30" year="2090" />
<item month="2" day="18" year="2091" />
<item month="2" day="7" year="2092" />
<item month="1" day="27" year="2093" />
<item month="2" day="15" year="2094" />
<item month="2" day="5" year="2095" />
<item month="1" day="25" year="2096" />
<item month="2" day="12" year="2097" />
<item month="2" day="1" year="2098" />
<item month="1" day="21" year="2099" />
<item month="2" day="9" year="2100" />
</root>


===============SkyTree.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<item id="1" tree="甲" />
<item id="2" tree="乙" />
<item id="3" tree="丙" />
<item id="4" tree="丁" />
<item id="5" tree="戊" />
<item id="6" tree="己" />
<item id="7" tree="庚" />
<item id="8" tree="辛" />
<item id="9" tree="壬" />
<item id="10" tree="癸" />
</root>



=================AnimalSign.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<item id="1" name="鼠" tree="子" />
<item id="2" name="牛" tree="丑" />
<item id="3" name="虎" tree="寅" />
<item id="4" name="兔" tree="卯" />
<item id="5" name="龙" tree="辰" />
<item id="6" name="蛇" tree="巳" />
<item id="7" name="马" tree="午" />
<item id="8" name="羊" tree="未" />
<item id="9" name="猴" tree="申" />
<item id="10" name="鸡" tree="酉" />
<item id="11" name="狗" tree="戌" />
<item id="12" name="猪" tree="亥" />
</root>

===========================StarSign.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<item id="0" name="" />
<item id="1" name="白羊" />
<item id="2" name="金牛" />
<item id="3" name="双子" />
<item id="4" name="巨蟹" />
<item id="5" name="狮子" />
<item id="6" name="处女" />
<item id="7" name="天秤" />
<item id="8" name="天蝎" />
<item id="9" name="射手" />
<item id="10" name="摩羯" />
<item id="11" name="水瓶" />
<item id="12" name="双鱼" />
</root>

原创作品欢迎转载,请保留作者信息:邹健20070106深夜
原创粉丝点击