7.6 使用PHP制作万年历
使用PHP生成万年历,主要使用了date()和mktime()函数,通过万年历的代码,可以详细了解这两个函数的使用方法。
本节的代码中主要用了如下3个函数来实现万年历。
·date()函数,用于格式化时间和取得当前时间信息。
·mktime()函数用于取得请求的时间段的时间戳。
·checkdate()函数,用于检查参数运算的年、月、日是否合法。
代码7-6万 年历7-6.php
01 <html> 02 <head> 03 <title> 万年月历</title> 04 <meta http-equiv="Content-Type" content="text/html; charset=gb_2312"> 05 <!-- Style --> 06 <style type=text/css > 07 <!-- 08 table{ 09 background-color: #B0C4DE; 10 } 11 tr{ 12 background-color: White; 13 } 14 td{ 15 font-size: 20pt; 16 font-family : 宋体; 17 color: #708090; 18 line-height: 140%; 19 } 20 --> 21 </style> 22 </head> 23 <body> 24 <?php 25 // 检测用户是否提交数据 26 if(isset($_POST["year"])){ 27 // 使用用户提交的数据作为年数据 28 $year = $_POST["year"]; 29 }else{ 30 // 使用当前日期的年作为年数据 31 $year = date("Y"); 32 } 33 if(isset($_POST["month"])){ 34 $month = $_POST["month"]; 35 }else{ 36 $month = date("m"); 37 } 38 $date=01; // 初始化月数据 39 $day=01; // 初始化日数据 40 $off=0; 41 // 检测年数据是否正确 42 if($year<0 or $year > 9999){ 43 // 如果年数据不正确,显示错误信息,关返回上一页。 44 echo "<script> alert(' 年份应在1 至9999 之间.');history.go(-1); </script>"; 45 exit(); 46 } 47 if($month<0 or $month > 12){ 48 // 如果月数据不正确,显示错误信息,关返回上一页。 49 echo "<script> alert(' 月份应在1 至12 月之间.');history.go(-1); </script> "; 50 exit(); 51 } 52 while(checkdate($month,$date,$year)){ 53 $date++; 54 } 55 // 绘制万年历表头 56 ?> 57 <form method=post action='' name=calendar> 58 <table width=100% border=1 cellspacing=0 cellpadding=2 bordercolorlight=#333333 59 bordercolordark=#FFFFFF bgcolor=#CCCCFF> 60 <tr align=center valign=middle> 61 <td colspan=7 bgcolor=#efefef> 62 <input type='text' name='year' size='4' maxlength='4' value=<?=$year?> > 63 <input type='text' name='month' size='2' maxlength='2' value=<?=$month?> > 64 <input type='submit' name='submit' align=absmiddle border=0 value=' 跳转'> 65 </td> 66 </tr> 67 <tr align=center valign=middle> 68 <td bgcolor=#efefef> 日</td> 69 <td> 一</td> 70 <td> 二</td> 71 <td> 三</td> 72 <td> 四</td> 73 <td> 五</td> 74 <td bgcolor=#efefef> 六</td> 75 </tr> 76 <tr> 77 <?php 78 // 构建万年历内容 79 while ($day<$date){ 80 // 设置日期颜色,如果是当前日期,使用红色进行标识 81 if($day == date("d") && $year == date("Y") && $month == date("m")){ 82 $day_color = "red"; 83 }else{ 84 $day_color = "black"; 85 } 86 // 设置星期天数据 87 if ($day == '01' and date( 'l', mktime(0,0,0,$month,$day,$year)) == 'Sunday'){ 88 echo "<td><font color=$day_color>$day</font></td>"; 89 $off = '01'; 90 }elseif($day == '01' and date( 'l', mktime(0,0,0,$month,$day,$year)) == 'Monday'){ 91 // 设置星期一的数据 92 echo "<td> </td><td><font color=$day_color>$day</font></td>"; 93 $off= '02'; 94 }elseif($day == '01' and date( 'l', mktime(0,0,0,$month,$day,$year)) == 'Tuesday'){ 95 // 设置星期二的数据 96 echo "<td> </td><td> </td><td><font color=$day_color>$day</ font></td>"; 97 $off= '03'; 98 }elseif($day == '01' and date( 'l', mktime(0,0,0,$month,$day,$year)) == 'Wednesday'){ 99 // 设置星期三的数据 100 echo "<td> </td><td> </td><td> </td><td><font 101 color=$day_color>$day</font></td>"; 102 $off= '04'; 103 }elseif($day == '01' and date( 'l', mktime(0,0,0,$month,$day,$year)) == 'Thursday'){ 104 // 设置星期四的数据 105 echo "<td> </td><td> </td><td> </td><td> </td> <td><font 106 color=$day_color>$day</font></td>"; 107 $off= '05'; 108 }elseif($day == '01' and date( 'l', mktime(0,0,0,$month,$day,$year)) == 'Friday') { 109 // 设置星期五的数据 110 echo 111 "<td> </td><td> </td><td> </td><td> </td><td> </td><td><font 112 color=$day_color>$day</font></td>"; 113 $off= '06'; 114 }elseif($day == '01' and date( 'l', mktime(0,0,0,$month,$day,$year)) == 'Saturday') { 115 // 设置星期六的数据 116 echo 117 "<td> </td><td> </td><td> </td><td> </td><td> </td><td> </td> <td><font 118 color=$day_color>$day</font></td>"; 119 $off= '07'; 120 }else{ 121 // 直接显示日期 122 echo "<td><font color=$day_color>$day</font></td> \n"; 123 } 124 // 递增while 循环条件 125 $day++; 126 // 设置开关变量 127 $off++; 128 // 当$off 大于7 时,重起一行,并把$off 变量置为1 129 if ($off>7) { 130 echo "</tr><tr>"; 131 $off= '01'; 132 }else{ 133 echo ""; 134 } 135 } 136 // 计算剩下的数据,使用空表格填充 137 for($i=$off ; $i<=7 ; $i++){ 138 echo "<td> </td>"; 139 } 140 ?> 141 </tr> 142 </table> 143 </form> 144 </body> 145 </html>
【代码解析】代码通过3个日期函数实现了万年历的绘制,从代码中看并没有什么复杂的函数应用。其过程主要是通过while循环,显示指定年月的天数,并使用if语句处理日期前的空间,把其转化为表格。代码的运行效果如图7-6所示。
图7-6 万年历