各种Web脚本下,日历的实现方法

在Web开发中我们经常会需要开发一些和日历相关的应用,自然需要制作一些日历程序,一些大家伙比如C#,JAVA或是VB.NET这些语言以往都有不少文章和示例介绍了,所以今天我给大家说一下其他常见Web脚步语言中的日历算法逻辑和具体的实现方式,希望对大家有用。

先看看我们的实现目标,就是在网页中通过脚本语言实现如下的日历:

 date.gif

要实现日历就必须用到相关语言中的日期和时间函数,其中最重要的是具有下面功能的两个函数:

  • 能返回指定日期是星期几的函数
  • 能返回指定年份和月份一共有多少天的函数,或者可以返回指定两个日期之间相差多少天的函数

只要语言中具有上面两个功能的函数就可以轻松实现日历。

实现日历的算法逻辑大致如下:

  1. 取得当前要显示的月份的1号是在星期几
  2. 取得当前要显示的月份一共有多少天
  3. 通过HTML的方式生成一个HTML的表格来显示日历(每行显示一周,并根据需要来决定是生成5行还是6行的表格)
  4. 根据显示的月份1号所在星期几空出前面的不属于该月日期的表格单元格
  5. 根据显示的月份1号所在星期几来决定生成表格时从星期几开始生成日历显示(第一天在星期几)
  6. 根据一共有多少天来顺次生成指定天数,另外每生成七个单元格需要加入一个表格的换行
  7. 补足HTML表格空缺的单元格

剩下的就是根据不同语言中具体的函数来实现了:

下面是根据上述算法和逻辑在asp中的具体实现代码:

 

 

 1 None.gif < style >
 2 None.giftd { font - family:  " 宋体 " ; font - size:9pt}
 3 None.gif </ style >
 4 None.gif < body bgcolor = " eeeeee " >
 5 None.gif < table width = " 180 "  cellpadding = " 0 "  cellspacing = " 1 "  bgcolor = " dddddd "  align = center >
 6 None.gif < %
 7 None.gif ' 以下为ASP中通过该日历算法实现的具体代码
 8 None.gif
 9 None.gif     ' 先判断是否指定了一个年份和月份,没有则根据当前的年和月份显示
10 None.gif      If  Request( " ReqDate " ) = ""   then
11 None.gif         CurrentDate = Date
12 None.gif     else
13 None.gif         CurrentDate = Trim (Request( " ReqDate " ))
14 None.gif     end   if  
15 None.gif    pyear = year (CurrentDate)
16 None.gif    pmonth = month (CurrentDate)
17 None.gif
18 None.gif     ' 以下的代码生成日历显示的表格头内容
19 None.gif % >
20 None.gif   < tr align = " LEFT "  bgcolor = " #dddddd " >  
21 None.gif     < td width = " 14% "  height = " 19 "  align = " center " >
22 None.gif         < input type = " button "  value = " << "  onclick = " JavaScript:location.href='?ReqDate=<%=DateAdd( " m " ,-1,CurrentDate) %>' " >
23 None.gif     </ td >
24 None.gif     < td colspan = " 5 "  align = " center " >
25 None.gif         < % = pyear% > < % = pmonth% >
26 None.gif     </ td >
27 None.gif     < td width = " 14% "  align = " center " >
28 None.gif         < input type = " button "  value = " >> "  onclick = " JavaScript:location.href='?ReqDate=<%=DateAdd( " m " ,1,CurrentDate)%>' " >
29 None.gif     </ td >
30 None.gif   </ tr >
31 None.gif   < tr align = " center "  bgcolor = " #CCCCCC " >  
32 None.gif     < td width = " 14% "  height = " 19 " >  日 </ td >
33 None.gif     < td width = " 14% " >  一 </ td >
34 None.gif     < td width = " 14% " >  二 </ td >
35 None.gif     < td width = " 14% " >  三 </ td >
36 None.gif     < td width = " 14% " >  四 </ td >
37 None.gif     < td width = " 14% " >  五 </ td >
38 None.gif     < td width = " 14% " >  六 </ td >
39 None.gif   </ tr >
40 None.gif   < tr align = center bgcolor = ffffff height = 19 >
41 None.gif   < %
42 None.gif   ' 由于ASP中没有获取指定月共有多少天的函数,因此我们需要通过其他算法来获得,算法其实很简单,就是计算一下要显示月份的1日至下个月的1日一共相差几天
43 None.gif     fromDate  =   FormatDateTime ( month (CurrentDate)  &   " /1/ "   &    year (CurrentDate)) 
44 None.gif    toDate  =   FormatDateTime ( DateAdd ( " m " , 1 ,fromDate)) 
45 None.gif     ' 获得要显示月份的第一天为周几
46 None.gif     nunmonthstart = weekday (fromDate) - 1
47 None.gif     ' 获得要显示的1日至下个月的1日一共相差几天(月份一共有多少天)
48 None.gif     nunmonthend = DateDiff ( " d " ,fromDate,toDate)
49 None.gif     ' 判断显示日历需要用几行表格来显示(每行显示7天)
50 None.gif      if  nunmonthstart + nunmonthend < 36   then
51 None.gif         maxi = 36
52 None.gif     else
53 None.gif         maxi = 43
54 None.gif     end   if
55 None.gif     ' 循环生成表格并显示
56 None.gif     i = 1
57 None.gif     do   while  i < maxi
58 None.gif        iv = i - nunmonthstart
59 None.gif         if  i > nunmonthstart  and  i <= nunmonthend + nunmonthstart  then
60 None.gif             ' 如果为显示的是今天则用红色背景显示
61 None.gif              if  iv = Day ( now and   month ( now ) = pmonth  and   year ( now ) = pyear  then
62 None.gif                response.write(  " <td align=center bgcolor=ffaaaa><a href='#' target=_blank> "   &  iv  &   " </a></td> " )
63 None.gif             else
64 None.gif                response.write(  " <td align=center><a href='#' target=_blank> "   &  iv  &   " </a></td> " )
65 None.gif             end   if
66 None.gif         else
67 None.gif            response.write(  " <td> </td> " )
68 None.gif         end   if
69 None.gif
70 None.gif         ' 如果能被7整除(每行显示7个)则输出一个换行
71 None.gif          if  i  mod   7 = 0   then
72 None.gif            response.write(  " </tr><tr align=center bgcolor=ffffff height=19> " )
73 None.gif         end   if
74 None.gif        i = i + 1
75 None.gif     loop
76 None.gif% >
77 None.gif </ table >
78 None.gif </ body >


具体实现效果如下:

asp.gif

下面是根据上述算法和逻辑在PHP中的具体实现代码:
 1None.gif<style>
 2ExpandedBlockStart.gifContractedBlock.giftd dot.gif{ font-family: "宋体"; font-size:9pt}
 3None.gif</style>
 4None.gif<body bgcolor="eeeeee">
 5None.gif<table width="180" cellpadding="0" cellspacing="1" bgcolor="dddddd" align=center>
 6None.gif<?
 7None.gif//以下为PHP中通过该日历算法实现的具体代码
 8None.gif
 9None.gif    //先判断是否指定了一个年份和月份,没有则根据当前的年和月份显示
10ExpandedBlockStart.gifContractedBlock.gif    if($ReqDate=="")dot.gif{
11InBlock.gif        $pyear=date("Y");
12InBlock.gif        $pmonth=date("m");
13InBlock.gif        $CurrentDate=date("Y-m-j");
14ExpandedBlockStart.gifContractedBlock.gif    }
elsedot.gif{
15InBlock.gif        $ReqDateStrs = explode("-",$ReqDate );
16InBlock.gif        $pyear=$ReqDateStrs[0];
17InBlock.gif        $pmonth=$ReqDateStrs[1];
18InBlock.gif        $CurrentDate=$ReqDate;
19ExpandedBlockEnd.gif    }

20None.gif
21None.gif//以下的代码生成日历显示的表格头内容
22None.gif?>
23None.gif<tr align="center" bgcolor="#dddddd"> 
24None.gif    <td width="14%" height="19" align="center">
25None.gif        <input type="button" value="<<" onclick="JavaScript:location.href='?ReqDate=<? echo date("Y-m-j",mktime(0,0,0,$pmonth-1,1,$pyear)); ?>'">
26None.gif    </td>
27None.gif    <td colspan="5" align="center">
28None.gif        <? echo $CurrentDate; ?>
29None.gif    </td>
30None.gif    <td width="14%" align="center">
31None.gif        <input type="button" value=">>" onclick="JavaScript:location.href='?ReqDate=<? echo date("Y-m-j",mktime(0,0,0,$pmonth+1,1,$pyear)); ?>'">
32None.gif    </td>
33None.gif  </tr>
34None.gif  <tr align="center" bgcolor="#CCCCCC"> 
35None.gif    <td width="14%" height="19"> 日</td>
36None.gif    <td width="14%"> 一</td>
37None.gif    <td width="14%"> 二</td>
38None.gif    <td width="14%"> 三</td>
39None.gif    <td width="14%"> 四</td>
40None.gif    <td width="14%"> 五</td>
41None.gif    <td width="14%"> 六</td>
42None.gif  </tr>
43None.gif  <tr align=center bgcolor=ffffff height=19>
44None.gif<?
45None.gif    //获得要显示月份的第一天为周几
46None.gif    $nunmonthstart=date('w',mktime(0,0,0,$pmonth,1,$pyear));
47None.gif    //获得要显示月份一共有多少天
48None.gif    $nunmonthend=date('t',mktime(0,0,0,$pmonth,1,$pyear));
49None.gif    //判断显示日历需要用几行表格来显示(每行显示7天)
50ExpandedBlockStart.gifContractedBlock.gif    if($nunmonthstart+$nunmonthend<36)dot.gif{
51InBlock.gif        $maxi=36;
52ExpandedBlockEnd.gif    }

53ExpandedBlockStart.gifContractedBlock.gif    elsedot.gif{
54InBlock.gif        $maxi=43;
55ExpandedBlockEnd.gif    }

56None.gif    //循环生成表格并显示
57None.gif    for( $i=1; $i <$maxi; $i++)
58ExpandedBlockStart.gifContractedBlock.gif    dot.gif{
59InBlock.gif        $iv=$i-$nunmonthstart;
60ExpandedSubBlockStart.gifContractedSubBlock.gif        if($i>$nunmonthstart && $i<=$nunmonthend+$nunmonthstart) dot.gif{
61InBlock.gif            //如果为显示的是今天则用红色背景显示
62ExpandedSubBlockStart.gifContractedSubBlock.gif            if($iv==date("d"&& date("n")==$pmonth && date("Y")==$pyear)dot.gif{
63InBlock.gif                print( "<td align=center bgcolor=ffaaaa><a href='#' target=_blank>".$iv."</a></td>" );
64ExpandedSubBlockStart.gifContractedSubBlock.gif            }
elsedot.gif{
65InBlock.gif                print( "<td align=center><a href='#' target=_blank>".$iv."</a></td>" );
66ExpandedSubBlockEnd.gif            }

67ExpandedSubBlockStart.gifContractedSubBlock.gif        }
elsedot.gif{
68InBlock.gif            print( "<td> </td>" ); 
69ExpandedSubBlockEnd.gif        }

70InBlock.gif
71InBlock.gif        //如果能被7整除(每行显示7个)则输出一个换行
72ExpandedSubBlockStart.gifContractedSubBlock.gif        if ($i%7 ==0dot.gif{
73InBlock.gif            print( "</tr><tr align=center bgcolor=ffffff height=19>" );
74ExpandedSubBlockEnd.gif        }

75ExpandedBlockEnd.gif    }

76None.gif?>
77None.gif</tr>
78None.gif</table>
79None.gif</body>
80None.gif</html>


具体实现效果如下:
php.gif

下面是根据上述算法和逻辑在NoahWeb中的具体实现代码(一种面象动作驱动的语言):

 1ExpandedBlockStart.gifContractedBlock.gif<%dot.gif@ Page language="c#" AutoEventWireup="false" Inherits="NoahWeb.Engine" %>
 2ExpandedBlockStart.gifContractedBlock.gif<style>dot.gif
 3ExpandedSubBlockStart.gifContractedSubBlock.giftd {dot.gif}{ font-family: "宋体"; font-size:9pt}
 4None.gif
</style>
 5None.gif<!-- NoahComment 以下为NoahWeb表现层通过该日历算法实现的具体代码 -->
 6None.gif
 7None.gif<!-- NoahComment 先判断是否指定了一个年份和月份,没有则根据当前的年和月份显示 -->
 8None.gif<!-- NoahIf EX="[_root.ReqDate]==[null]" -->
 9None.gif    <!-- NoahSetValue SetName="CurrentDate" SetValue="date('O',mktime())"  -->
10None.gif<!-- NoahElse -->
11None.gif    <!-- NoahSetValue SetName="CurrentDate" SetValue="[_root.ReqDate]"  -->
12None.gif<!-- NoahEndIf -->
13None.gif
14None.gif<!-- NoahSetValue SetName="pyear" SetValue="date('Y',mktime([CurrentDate]))" -->
15None.gif<!-- NoahSetValue SetName="pmonth" SetValue="date('n',mktime([CurrentDate]))" -->
16None.gif
17None.gif<!-- NoahComment 以下的代码生成日历显示的表格头内容 -->
18None.gif<body bgcolor="eeeeee">
19None.gif<table width="180" cellpadding="0" cellspacing="1" bgcolor="dddddd" align=center>
20None.gif<tr align="LEFT" bgcolor="#dddddd"> 
21None.gif    <td width="14%" height="19" align="center">
22None.gif        <input type="button" value="<<" onclick="JavaScript:location.href='?ReqDate=<!-- NoahValue ValueName="date('O',totime(mktime([CurrentDate]),0,-1))" -->'">
23None.gif    </td>
24None.gif    <td colspan="5" align="center">
25None.gif        <!-- NoahValue ValueName="[pyear]" --><!-- NoahValue ValueName="[pmonth]" -->
26None.gif    </td>
27None.gif    <td width="14%" align="center">
28None.gif        <input type="button" value=">>" onclick="JavaScript:location.href='?ReqDate=<!-- NoahValue ValueName="date('O',totime(mktime([CurrentDate]),0,1))" -->'">
29None.gif    </td>
30None.gif  </tr>
31None.gif  <tr align="center" bgcolor="#CCCCCC"> 
32None.gif    <td width="14%" height="19"> 日</td>
33None.gif    <td width="14%"> 一</td>
34None.gif    <td width="14%"> 二</td>
35None.gif    <td width="14%"> 三</td>
36None.gif    <td width="14%"> 四</td>
37None.gif    <td width="14%"> 五</td>
38None.gif    <td width="14%"> 六</td>
39None.gif  </tr><tr bgcolor=ffffff height=19>
40None.gif
41None.gif<!-- NoahComment 获得要显示月份的第一天为周几 -->
42None.gif<!-- NoahSetValue SetName="nunmonthstart" SetValue="date('w',mktime([pyear],[pmonth],1,0,0,0))" -->
43None.gif
44None.gif<!-- NoahComment 获得要显示月份一共有多少天 -->
45None.gif<!-- NoahSetValue SetName="nunmonthend" SetValue="date('t',mktime([pyear],[pmonth],1,0,0,0))" -->
46None.gif
47None.gif<!-- NoahComment 判断显示日历需要用几行表格来显示(每行显示7天) -->
48None.gif<!-- NoahIf EX="[nunmonthstart]+[nunmonthend]<36" -->
49None.gif    <!-- NoahSetValue SetName="maxi" SetValue="36"  -->
50None.gif<!-- NoahElse -->
51None.gif    <!-- NoahSetValue SetName="maxi" SetValue="43"  -->
52None.gif<!-- NoahEndIf -->
53None.gif
54None.gif<!-- NoahComment 循环生成表格并显示 -->
55None.gif<!-- NoahForStart InitVar="i" InitValue="1" EX="[i]<[maxi]" NextVar="i" NextValue="[i]+1" -->
56None.gif
57None.gif    <!-- NoahSetValue SetName="iv" SetValue="[i]-[nunmonthstart]" -->
58None.gif
59None.gif    <!-- NoahComment 如果为显示的是今天则用红色背景显示 -->
60None.gif    <!-- NoahIf EX="[iv]==date('d',mktime())&&date('n',mktime())==[pmonth]&&date('Y',mktime())==[pyear]" -->
61None.gif        <td align="center" bgcolor=ffaaaa>
62None.gif    <!-- NoahElse -->
63None.gif        <td align="center">
64None.gif    <!-- NoahEndIf -->
65None.gif
66None.gif    <!-- NoahComment 如果是一个有效的日期则输出该日期并超链接,如果不为一有效日期则不做输出(由于NoahWeb控制HTML代码比较方便所以逻辑在这做了一点改变让我少写点代码,哈) -->
67None.gif    <!-- NoahIf EX="[i]>[nunmonthstart]&&[i]<=[nunmonthend]+[nunmonthstart]" -->
68None.gif        <href='#' target=_blank><!-- NoahValue ValueName="[iv]" --></a>
69None.gif    <!-- NoahEndIf --> </td>
70None.gif
71None.gif    <!-- NoahComment 如果能被7整除(每行显示7个)则输出一个换行 -->
72None.gif    <!-- NoahIf EX="[i]%7==0" -->
73None.gif        </tr><tr bgcolor=ffffff height=19>
74None.gif    <!-- NoahEndIf -->
75None.gif
76None.gif<!-- NoahForEnd -->
77None.gif</tr>
78None.gif</table>
79None.gif</body>
80None.gif</html>



具体实现效果如下:
noahweb.gif

源码下载:http://www.cnblogs.com/Files/Aiasted/c.rar

转载于:https://www.cnblogs.com/Aiasted/archive/2005/07/31/204143.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值