用PHP写一个简单的日历 - [技术相关]
日历被广泛应用于网络日志。作为网络日志导航的一种实现方式,我们不需要太复杂的日历,有年、月、日、周日即可,本文要讨论的就是这类简单的日记。
一个日历在布局上要求日期和星期相对应,可以用表格来实现。一周有七天,我们将写一个7×N的表格来构造我们的日历。星期将是固定地写在表格的某一 行(通常为第一行或第二行)。为此,我们首先需要判断当前要处理的月份的第一天是星期几以便确定第一天写在表格第二行或第三行的第几个单元格。
确定某年的某个月有多少天,在PHP中可以简单地用date()函数取得。比如,要取得此时所属月份的日期总数,只需要简单的打印 date("t") 即可。而要取得任意年任何月份的天数,需要借用mktime()函数,mktime()返回一个从UNIX时代(1970年1月1日)开始以来的秒数,它 的格式如下:mktime(时,分,秒,月,日,年)。比如,mktime(0,0,0,2,22,2006)返回从1970年1日1日到2006年2月 22日的秒数。值得注意的是,mktime()函数所能处理的日历范围从1970年开始,到2037年止(Windows XP的日期从(1980年到2099年),这意味着我们制作的PHP日历是有年份限制的。
知道要处理的月份的第一天为星期几,就可以开始制作日历了。比如2006年2月1日为星期三,日期将从表格中要显示日期的第一行的第四个单元格写
起,直到写完当月的所有日期。前面说过,表格是7×N格式的,什么时候写<tr>标签,什么时候写</tr>标签,以及最后一行
应该合并多少个单元格,都必须考虑在内。可以考虑用取余数运算符号“%”来确定tr标签的起始:
$i%7=0 → 写 <tr> 标签;
$i%7=6 → 写 </tr> 标签;
表格的最后一行可能会存在一些空的单元格(正如写日期的第一行前面可能有空单元格一样),可以这么处理:通过计算余数,如果写完日期后还剩2个或以上单元格的就合并它们,只剩下一个的就写一个td标签,此部分请参考稍后提供的代码进行理解。
一个日历,年份和月份是动态变化的,可以简单地给年份和月份制作前进、后退链接,我们用一组三元运算符来确定链接取值,以下以年的倒退链接值为例加以简单说明:
$y_lnk1=$year<=1970?$year=1970:$year-1;
这句代码,先判断当前处理年($year)的年份是否小于等于1970年,如果成立,则把年定死在1970年上($year=1970),不再往前倒退,反之,如果当前处理年的年份大于1970年,则令该链接的值(即年份)倒退一年($year-1)。
其他的链接(年前进、月倒退、月前进)道理同上。
以下是整个日历的完整代码,使用时请把美元符号改为小角状态:
<?php
//php日历程序 文件名:cal.php
if(empty($year)) $year=date("Y"); //初始化年份
if(empty($month)) $month=date("n"); //初始化月份
$wd_ar=array("日","一","二","三","四","五","六"); //星期数组
$wd=date("w",mktime(0,0,0,$month,1,$year)); //当月第一天是星期几
//年链接
$y_lnk1=$year<=1970?$year=1970:$year-1;
$y_lnk2=$year>=2037?$year=2037:$year+1;
//月链接
$m_lnk1=$month<=1?$month=1:$month-1;
$m_lnk2=$month>=12?$month=12:$month+1;
print "<table style=\"border:1px solid #ccc\" cellpadding=\"6\" cellspacing=\"0\" width=\"200\" bgcolor=\"#eeeeee\">
<tr align=\"center\" bgcolor=\"#cccccc\">
";
print
"<td colspan=\"4\"><a href=\"$php_self?year=$y_lnk1&month=$month\"><</a>
".$year."年 <a href=\"$php_self?year=$y_lnk2&month=$month\">></a><
/td>
";
print "<td colspan=\"3\"><a href=\"$php_self?year=$year&month=$m_lnk1\"><</a>
".$month."月 <a href=\"$php_self?year=$year&month=$m_lnk2\">></a><
/td>
</tr>
<tr align=\"center\">
";
for($i=0;$i<7;$i++) {
print "<td>$wd_ar[$i]</td>
";
}
print "</tr>
";
$tnum=$wd+date("t",mktime(0,0,0,$month,1,$year));
for($i=0;$i<$tnum;$i++) {
$date=$i+1;
if($i%7==0) print "<tr align=\"center\">
";
print "<td>";
if($i>=$wd) print $date-$wd;
print "</td>
";
if($i%7==6) print "</tr>
";
}
if($i%7<6 && $i%7>0) print "<td colspan=\"".(7-$i%7)."\"></td>
</tr>
";
if($i%7==6) print "<td></td>
</tr>
";
print "</table>";
?>
代码非常简单,两个日期函数的灵活运用和简单的一些算法,就能完成一个日历的编写工作,php的确不简单。以下是效果演示:
>> php日历效果演示
收藏到:Del.icio.us












