用PHP寫一個簡單的日曆

yeahokay發表於2007-09-19

用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標籤的起始:

$i%7=0 → 寫 標籤;
$i%7=6 → 寫 標籤;

表格的最後一行可能會存在一些空的單元格(正如寫日期的第一行前面可能有空單元格一樣),可以這麼處理:透過計算餘數,如果寫完日期後還剩2個或以上單元格的就合併它們,只剩下一個的就寫一個td標籤,此部分請參考稍後提供的程式碼進行理解。

一個日曆,年份和月份是動態變化的,可以簡單地給年份和月份製作前進、後退連結,我們用一組三元運算子來確定連結取值,以下以年的倒退連結值為例加以簡單說明:

$y_lnk1=$year<=1970?$year=1970:$year-1;

這句程式碼,先判斷當前處理年($year)的年份是否小於等於1970年,如果成立,則把年定死在1970年上($year=1970),不再往前倒退,反之,如果當前處理年的年份大於1970年,則令該連結的值(即年份)倒退一年($year-1)。

其他的連結(年前進、月倒退、月前進)道理同上。

以下是整個日曆的完整程式碼,使用時請把美元符號改為小角狀態:


//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 "

";
print " ";
print " ";
for($i=0;$i<7;$i++) {
print " ";
}
print " ";

$tnum=$wd+date("t",mktime(0,0,0,$month,1,$year));
for($i=0;$i $date=$i+1;
if($i%7==0) print " ";
print " ";
if($i%7==6) print " ";
}
if($i%7<6 && $i%7>0) print " ";
if($i%7==6) print " ";

print "
< ".$year."年 >< ".$month."月 >
$wd_ar[$i]
";
if($i>=$wd) print $date-$wd;
print "
";

?>

程式碼非常簡單,兩個日期函式的靈活運用和簡單的一些演算法,就能完成一個日曆的編寫工作

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/786540/viewspace-970128/,如需轉載,請註明出處,否則將追究法律責任。

相關文章