使用ASP编写农历算法 新年将近,呵呵,写了一个阴历和阳历的ASP程序,就当给大家的新年贺礼 (呵呵,这下蓝先生满意啦把,就当我送给你的圣诞礼物把。。。) 希望大家能够喜欢。。。大家可以很方便的将这个农历加入到自己的主页中 中国人使用中国人自己的日历,呵呵,希望大家以后能够支持Chinaasp的 共同进步。。。 一共两个文件cal.asp和cal2.inc(主要是常量的定义) cal.asp代码如下 <!--#include virtual="cal2.inc"--> <% Function GongDataIsValid(m_date) if Not IsDate(m_date) Then GongDataIsValid = False Exit Function else if Year(m_date) >1950 AND Year(m_date) < 2050 Then GongDataIsValid = true Exit Function else if Year(m_date)=1950 Then if Month(m_date)>2 Then GongDataIsValid = true Exit Function else if Month(m_date)=2 Then if Day(m_date) > 16 Then GongDataIsValid = true Exit Function End If End If End If End If End If End If GongDataIsValid = FALSE End Function
Function NongDataIsValid(m_date) if Year(m_date) > 1949 AND Year(m_date) < 2049 Then NongDataIsValid = true Exit Function else if Year(m_date)=2049 Then if Month(m_date.month) < 12 Then NongDataIsValid = true Exit Function else if Month(m_date)=12 Then if Day(m_date) < 8 Then NongDataIsValid = true Exit Function End If End If End If End If End If NongDataIsValid = False End Function
Function ConvertToGongLi(m_nongli) Dim days Dim years Dim alldays Dim result
days= DaysFromSpringDay(m_nongli) days= days + GetDaysFromStart(Year(m_nongli)) years = Year(m_nongli) alldays = GetGongYearDays(years) if days > alldays Then days = days - alldays years = years + 1 end If result= CalGongDate(years,days) ConvertToGongLi = result End Function
Function ConvertToNongLi(m_gongli) Dim days Dim years Dim alldays Dim result
days= DaysFromNewYear(m_gongli) alldays = GetDaysFromStart(Year(m_gongli)) years = Year(m_gongli) if days <= alldays Then years = years - 1 days= days + GetGongYearDays(years) end if days = days - GetDaysFromStart(years) result = CalNongDate(years,days) ConvertToNongLi = result end function
Function GetDateAfterDays(m_first,m_days) Dim m_firstdays m_firstdays = DaysFromNewYear(m_first) + m_days GetDateAfterDays = CalGongDate(Year(m_first),m_firstdays) End Function
Function CalGongDate(years,days) Dim resultday,resultyear,resultmonth dim caldays caldays = 0 resultyear = years for i=1 To 13 - 1 caldays =caldays + GetGongMonthDays(years,i) if caldays>=days then caldays = caldays - GetGongMonthDays(year,i) resultmonth = i resultday=days-caldays exit for end if next CalGongDate=resultyear & "-" & resultmonth & "-" & resultday end function
function CalNongDate(years,days) Dim resultday,resultyear,resultmonth dim caldays caldays = 0
resultyear = years IsRunyue = false
for i=1 to 12 caldays = caldays + GetNotRunNongMonthDays(years,i) if caldays>=days then caldays = caldays - GetNotRunNongMonthDays(years,i) resultmonth = i resultday = days - caldays IsRunyue = false exit for else if GetNongRunYue(years) = i then caldays = caldays + GetNongRunYueDays(years) if caldays>=days then caldays = caldays - GetNongRunYueDays(years) resultmonth = i resultday = days - caldays IsRunyue = true exit for end if end if end if next CalNongDate=resultyear & "-" & resultmonth & "-" & resultday end function
function GetGongMonthDays(years,months) GetGongMonthDays = 30 if months = 2 then if YearIsRunNian(years) Then GetGongMonthDays = 29 else GetGongMonthDays = 28 end if else if GongMonthIsLarge(months) Then GetGongMonthDays = 31 else GetGongMonthDays = 30 end if end if end function
function GetNongLiDayName(mdays) Dim i,j
i = InStr(mdays,"-") j = InStr(i+1,mdays,"-") GetNongLiDayName = Right(mdays,Len(mdays) - j) GetNongLiDayName = NongLiDayName(Int(GetNongLiDayName) - 1) end function
function GetNongLiMonthName(mdays) Dim i,j
i = InStr(mdays,"-") j = InStr(i+1,mdays,"-") GetNongLiMonthName = Mid(mdays,i+1,j-i-1) GetNongLiMonthName = NongLiMonthName(Int(GetNongLiMonthName) - 1) end function
function GetNotRunNongMonthDays(years,months) if NongMonthIsLarge(years,months) Then GetNotRunNongMonthDays = 30 else GetNotRunNongMonthDays = 29 end if end function
function GetNongMonthDays(years,months,m_run) Dim days days = 0 if m_run then days = GetNongRunYueDays(years) else days = GetNotRunNongMonthDays(years,months) end if GetNongMonthDays = days end function
function GetGongYearDays(years) if YearIsRunNian(years) then GetGongYearDays = 366 else GetGongYearDays = 365 end if end function
function GetNongYearDays(years) dim days days = 0 for i=1 To 12 days =days + GetNongMonthDays(years,i,false) next days =days + GetNongRunYueDays(years) GetNongYearDays = days end function
function GetNongRunYueDays(years) if GetNongRunYue(years) =0 then GetNongRunYueDays = 0 exit function end if if RunYueIsLarge(years) then GetNongRunYueDays = 30 else GetNongRunYueDays = 29 end if end function
function DaysFromNewYear(m_day) Dim days days = 0 for i=1 to Month(m_day) - 1 days = days + GetGongMonthDays(year(m_day),i) next days = days + Day(m_day) DaysFromNewYear = days end function functionDaysFromSpringDay(m_day) Dim days Dim months days = 0 months = GetNongRunYue(year(m_day)) if months < Month(m_day) then days = days + GetNongRunYueDays(year(m_day)) else if((months=Month(m_day)) AND IsRunyue) then days = days + GetNongRunYueDays(year(m_day)) end if end if for i=1 to Month(m_day) days = days + GetNongMonthDays(year(m_day),i,false) next days = days + Day(m_day) DaysFromSpringDay = days end function
function Cal2N(n) Cal2N = 1 for i=0 to n - 1 Cal2N = Cal2N * 2 next end function
function GetNNameIn60(index) Dim ShengXiao Dim TianGan Dim DiZhi Dim buffer Dim m_cur,m_this,tian,di ShengXiao = Array("鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪") TianGan = Array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸") DiZhi = Array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥")
buffer = "农历"
m_cur= 0 m_this = 0 tian = 0 di = 0 for i=0 to 60 - 1 tian = i mod 10 di = i mod 12 if m_this = index then buffer = buffer & TianGan(tian) buffer = buffer & DiZhi(di) buffer = buffer & "年," buffer = buffer & ShengXiao(di) buffer = buffer & "年" end if m_this = m_this + 1 next GetNNameIn60 = buffer end function
function GetGanZhi(m_nongyear) dim m_index m_index = (m_nongyear - 1924) mod 60 GetGanZhi = GetNNameIn60(m_index) end function
function YearIsRunNian(years) YearIsRunNian = CalendarData(years-m_minyear,0) AND &H80 end function
function RunYueIsLarge(years) RunYueIsLarge = CalendarData(years-m_minyear,0) AND &H40 end function
function GetDaysFromStart(years) GetDaysFromStart = (CalendarData(years-m_minyear,0) AND &H3f) end function
function NongMonthIsLarge(years,months) NongMonthIsLarge = false if(months<9) then if(CalendarData(years-m_minyear,1) AND Cal2N(8 - months)) then NongMonthIsLarge = true end if else ch=Cal2N(12 - months) ch=MoveBit(ch) if(CalendarData(years-m_minyear,2) AND ch) thenNongMonthIsLarge = true end if end function
function GetNongRunYue(years) GetNongRunYue = (CalendarData(years-m_minyear,2) AND &H0f) end function
function GongMonthIsLarge(months) GongMonthIsLarge = false if months < 8 then if (months mod 2) <> 0 then GongMonthIsLarge = true end if else if ((months mod 2) = 0) then GongMonthIsLarge = true end if end if end function
%>
<SCRIPT LANGUAGE="JSCript" RUNAT=Server> function MoveBit(num) { return num<<=4; } </SCRIPT>
<% Dim DisplayNongLiDate Function GetDaysInMonth(iMonth, iYear) Select Case iMonth Case 1, 3, 5, 7, 8, 10, 12 GetDaysInMonth = 31 Case 4, 6, 9, 11 GetDaysInMonth = 30 Case 2 If IsDate("February 29, " & iYear) Then GetDaysInMonth = 29 Else GetDaysInMonth = 28 End If End Select End Function
Function GetWeekdayMonthStartsOn(dAnyDayInTheMonth) Dim dTemp dTemp = DateAdd("d", -(Day(dAnyDayInTheMonth) - 1), dAnyDayInTheMonth) GetWeekdayMonthStartsOn = WeekDay(dTemp) End Function
Function SubtractOneMonth(dDate) SubtractOneMonth = DateAdd("m", -1, dDate) End Function
Function AddOneMonth(dDate) AddOneMonth = DateAdd("m", 1, dDate) End Function
Dim dDate Dim iDIM Dim iDOW Dim iCurrent Dim iPosition
If IsDate(Request.QueryString("date")) Then dDate = CDate(Request.QueryString("date")) Else If IsDate(Request.QueryString("month") & "-" & Request.QueryString("day") & "-" & Request.QueryString("year")) Then dDate = CDate(Request.QueryString("month") & "-" & Request.QueryString("day") & "-" & Request.QueryString("year")) Else dDate = Date()
If Len(Request.QueryString("month")) <> 0 Or Len(Request.QueryString("day")) <> 0 Or Len(Request.QueryString("year")) <> 0 Or Len(Request.QueryString("date")) <> 0 Then Response.Write "对不起,你选择的日期非法,日期自动设置为当前日期.<BR><BR>" End If End If End If
iDIM = GetDaysInMonth(Month(dDate), Year(dDate)) iDOW = GetWeekdayMonthStartsOn(dDate)
%>
<TABLE BORDER=10 CELLSPACING=0 CELLPADDING=0> <TR> <TD> <TABLE BORDER=1 CELLSPACING=0 CELLPADDING=1 BGCOLOR=#99CCFF> <TR> <TD BGCOLOR=#000099 ALIGN="center" COLSPAN=7> <TABLE WIDTH=100% BORDER=0 CELLSPACING=0 CELLPADDING=0> <TR> <TD ALIGN="right"><A HREF="./cal.asp?date=<%= SubtractOneMonth(dDate) %>"><FONT COLOR=#FFFF00 SIZE="-1"><<</FONT></A></TD> <TD ALIGN="center"><FONT COLOR=#FFFF00><B><%= MonthName(Month(dDate)) & "" & Year(dDate) %><%= GetGanZhi(Year(dDate))%></B></FONT></TD> <TD ALIGN="left"><A HREF="./cal.asp?date=<%= AddOneMonth(dDate) %>"><FONT COLOR=#FFFF00 SIZE="-1">>></FONT></A></TD> </TR> </TABLE> </TD> </TR> <TR> <TD ALIGN="center" BGCOLOR=#0000CC><FONT COLOR=#FFFF00><B>星期日</B></FONT><BR><IMG SRC=http://cfan.net.cn/info/"images/spacer.gif" WIDTH=60 HEIGHT=1 BORDER=0></TD> <TD ALIGN="center" BGCOLOR=#0000CC><FONT COLOR=#FFFF00><B>星期一</B></FONT><BR><IMG SRC=http://cfan.net.cn/info/"images/spacer.gif" WIDTH=60 HEIGHT=1 BORDER=0></TD> <TD ALIGN="center" BGCOLOR=#0000CC><FONT COLOR=#FFFF00><B>星期二</B></FONT><BR><IMG SRC=http://cfan.net.cn/info/"images/spacer.gif" WIDTH=60 HEIGHT=1 BORDER=0></TD> <TD ALIGN="center" BGCOLOR=#0000CC><FONT COLOR=#FFFF00><B>星期三</B></FONT><BR><IMG SRC=http://cfan.net.cn/info/"images/spacer.gif" WIDTH=60 HEIGHT=1 BORDER=0></TD> <TD ALIGN="center" BGCOLOR=#0000CC><FONT COLOR=#FFFF00><B>星期四</B></FONT><BR><IMG SRC=http://cfan.net.cn/info/"images/spacer.gif" WIDTH=60 HEIGHT=1 BORDER=0></TD> <TD ALIGN="center" BGCOLOR=#0000CC><FONT COLOR=#FFFF00><B>星期五</B></FONT><BR><IMG SRC=http://cfan.net.cn/info/"images/spacer.gif" WIDTH=60 HEIGHT=1 BORDER=0></TD> <TD ALIGN="center" BGCOLOR=#0000CC><FONT COLOR=#FFFF00><B>星期六</B></FONT><BR><IMG SRC=http://cfan.net.cn/info/"images/spacer.gif" WIDTH=60 HEIGHT=1 BORDER=0></TD> </TR> <% If iDOW <> 1 Then Response.Write vbTab & "<TR>" & vbCrLf iPosition = 1 Do While iPosition < iDOW Response.Write vbTab & vbTab & "<TD> </TD>" & vbCrLf iPosition = iPosition + 1 Loop End If
iCurrent = 1 iPosition = iDOW Do While iCurrent <= iDIM If iPosition = 1 Then Response.Write vbTab & "<TR>" & vbCrLf End If
If iCurrent = Day(dDate) Then Response.Write vbTab & vbTab & "<TD BGCOLOR=#00FFFF><FONT SIZE=""-1""><B>" & iCurrent & "</B></FONT><BR>" DisplayNongLiDate = ConvertToNongLi(FormatDateTime(dDate,1)) Response.Write vbTab & GetNongLiMonthName(DisplayNongLiDate) & "月" & GetNongLiDayName(DisplayNongLiDate) & "<BR></TD>" & vbCrLf Else Response.Write vbTab & vbTab & "<TD><A HREF=""./cal.asp?date=" & Month(dDate) & "-" & iCurrent & "-" & Year(dDate) & """><FONT SIZE=""-1"">" & iCurrent & "</FONT></A><BR>" DisplayNongLiDate = ConvertToNongLi(FormatDateTime(Year(dDate) & "-" & Month(dDate) & "-" & iCurrent ,1)) Response.Write vbTab & GetNongLiMonthName(DisplayNongLiDate) & "月" & GetNongLiDayName(DisplayNongLiDate) & "<BR></TD>" & vbCrLf End If
If iPosition = 7 Then Response.Write vbTab & "</TR>" & vbCrLf iPosition = 0 End If
iCurrent = iCurrent + 1 iPosition = iPosition + 1 Loop
If iPosition <> 1 Then Do While iPosition <= 7 Response.Write vbTab & vbTab & "<TD> </TD>" & vbCrLf iPosition = iPosition + 1 Loop Response.Write vbTab & "</TR>" & vbCrLf End If %> </TABLE> </TD> </TR> </TABLE>
<BR>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0><TR><TD ALIGN="center"> <FORM ACTION="./cal.asp" METHOD=GET> <SELECT NAME="month"> <OPTION VALUE=1>一月</OPTION> <OPTION VALUE=2>二月</OPTION> <OPTION VALUE=3>三月</OPTION> <OPTION VALUE=4>四月</OPTION> <OPTION VALUE=5>五月</OPTION> <OPTION VALUE=6>六月</OPTION> <OPTION VALUE=7>七月</OPTION> <OPTION VALUE=8>八月</OPTION> <OPTION VALUE=9>九月</OPTION> <OPTION VALUE=10>十月</OPTION> <OPTION VALUE=11>十一月</OPTION> <OPTION VALUE=12>十二月</OPTION> </SELECT> <SELECT NAME="day"> <OPTION VALUE=1>1</OPTION> <OPTION VALUE=2>2</OPTION> <OPTION VALUE=3>3</OPTION> <OPTION VALUE=4>4</OPTION> <OPTION VALUE=5>5</OPTION> <OPTION VALUE=6>6</OPTION> <OPTION VALUE=7>7</OPTION> <OPTION VALUE=8>8</OPTION> <OPTION VALUE=9>9</OPTION> <OPTION VALUE=10>10</OPTION> <OPTION VALUE=11>11</OPTION> <OPTION VALUE=12>12</OPTION> <OPTION VALUE=13>13</OPTION> <OPTION VALUE=14>14</OPTION> <OPTION VALUE=15>15</OPTION> <OPTION VALUE=16>16</OPTION> <OPTION VALUE=17>17</OPTION> <OPTION VALUE=18>18</OPTION> <OPTION VALUE=19>19</OPTION> <OPTION VALUE=20>20</OPTION> <OPTION VALUE=21>21</OPTION> <OPTION VALUE=22>22</OPTION> <OPTION VALUE=23>23</OPTION> <OPTION VALUE=24>24</OPTION> <OPTION VALUE=25>25</OPTION> <OPTION VALUE=26>26</OPTION> <OPTION VALUE=27>27</OPTION> <OPTION VALUE=28>28</OPTION> <OPTION VALUE=29>29</OPTION> <OPTION VALUE=30>30</OPTION> <OPTION VALUE=31>31</OPTION> </SELECT> <SELECT NAME="year"> <OPTION VALUE=1990>1990</OPTION> <OPTION VALUE=1991>1991</OPTION> <OPTION VALUE=1992>1992</OPTION> <OPTION VALUE=1993>1993</OPTION> <OPTION VALUE=1994>1994</OPTION> <OPTION VALUE=1995>1995</OPTION> <OPTION VALUE=1996>1996</OPTION> <OPTION VALUE=1997>1997</OPTION> <OPTION VALUE=1998>1998</OPTION> <OPTION VALUE=1999 SELECTED>1999</OPTION> <OPTION VALUE=2000>2000</OPTION> <OPTION VALUE=2001>2001</OPTION> <OPTION VALUE=2002>2002</OPTION> <OPTION VALUE=2003>2003</OPTION> <OPTION VALUE=2004>2004</OPTION> <OPTION VALUE=2005>2005</OPTION> <OPTION VALUE=2006>2006</OPTION> <OPTION VALUE=2007>2007</OPTION> <OPTION VALUE=2008>2008</OPTION> <OPTION VALUE=2009>2009</OPTION> <OPTION VALUE=2010>2010</OPTION> </SELECT> <BR> <INPUT TYPE="submit" VALUE="在日历上显示该日期!"> </FORM> </TD></TR></TABLE>
|