Hello,大家好,前兩天給大家講解了下RBAC【基於角色的訪問控制】的基本思想,不知道大家是否已經明白其原理,使用起來是否得心應手,在開發項目的過程中可以嘗試運用下,這樣會理解的更加透徹,上文中給大家寫的那個RBAC類,並不一定真正適合我們的項目開發,給大家寫此類的目的只為幫助大家更透徹的理解RBAC的工作原理以及使用方法...
好了,大家可能已經覺得我啰嗦了,廢話不多說了,今天來給大家講解:
在已知開始日期,已知結束日期的基礎上,使用PHP的date函數遍歷輸出日歷:
日常生活中,日歷與我們的生活工作息息相關,必不可少,所以今天給大家講了日歷以後,大家可以嘗試著做一個電子日歷,每天提醒自己當天要完成的任務,還是很有趣的。
好,首先我們先來了解一下date函數,同學們都知道,date函數可以獲取當前的年月日,但date函數的功能不僅限於此,我們通過PHP官方手冊來查詢下它的參數看看:
format 字符 說明 返回值例子
日 --- ---
d 月份中的第幾天,有前導零的 2 位數字 01 到 31
D 星期中的第幾天,文本表示,3 個字母 Mon 到 Sun
j 月份中的第幾天,沒有前導零 1 到 31
l(“L”的小寫字母) 星期幾,完整的文本格式 Sunday 到 Saturday
N ISO-8601 格式數字表示的星期中的第幾天(PHP 5.1.0 新加) 1(表示星期一)到 7(表示星期天)
S 每月天數後面的英文後綴,2 個字符 st,nd,rd 或者 th。可以和 j一起用
w 星期中的第幾天,數字表示 0(表示星期天)到 6(表示星期六)
z 年份中的第幾天 0 到 366
星期 --- ---
W ISO-8601 格式年份中的第幾周,每周從星期一開始(PHP 4.1.0 新加的) 例如:42(當年的第 42 周)
月 --- ---
F 月份,完整的文本格式,例如 January 或者 March January 到 December
m 數字表示的月份,有前導零 01 到 12
M 三個字母縮寫表示的月份 Jan 到 Dec
n 數字表示的月份,沒有前導零 1 到 12
t 給定月份所應有的天數 28 到 31
年 --- ---
L 是否為閏年 如果是閏年為 1,否則為 0
o ISO-8601 格式年份數字。這和 Y 的值相同,只除了如果 ISO的星期數(W)屬於前一年或下一年,則用那一年。(PHP 5.1.0 新加) Examples: 1999 or 2003
Y 4 位數字完整表示的年份 例如:1999 或 2003
y 2 位數字表示的年份 例如:99 或 03
時間 --- ---
a 小寫的上午和下午值 am 或 pm
A 大寫的上午和下午值 AM 或 PM
B Swatch Internet 標准時 000 到 999
g 小時,12 小時格式,沒有前導零 1 到 12
G 小時,24 小時格式,沒有前導零 0 到 23
h 小時,12 小時格式,有前導零 01 到 12
H 小時,24 小時格式,有前導零 00 到 23
i 有前導零的分鐘數 00 到 59>
s 秒數,有前導零 00 到 59>
時區 --- ---
e 時區標識(PHP 5.1.0 新加) 例如:UTC,GMT,Atlantic/Azores
I 是否為夏令時 如果是夏令時為 1,否則為 0
O 與格林威治時間相差的小時數 例如:+0200
P 與格林威治時間(GMT)的差別,小時和分鐘之間有冒號分隔(PHP 5.1.3 新加) 例如:+02:00
T 本機所在的時區 例如:EST,MDT(【譯者注】在 Windows 下為完整文本格式,例如“EasternStandard Time”,中文版會顯示“中國標准時間”)。
Z 時差偏移量的秒數。UTC 西邊的時區偏移量總是負的,UTC 東邊的時區偏移量總是正的。 -43200 到 43200
完整的日期/時間 --- ---
c ISO 8601 格式的日期(PHP 5 新加) 2004-02-12T15:19:21+00:00
r RFC 822 格式的日期 例如:Thu, 21 Dec 2000 16:01:07 +0200
U 從 Unix 紀元(January 1 1970 00:00:00 GMT)開始至今的秒數
大家可以看到,php的date函數無所不能,那我們就用date函數來寫一個日歷出來:
<?php
/*+---------------------------------------------------------------------------------------+
| 日歷類
+-----------------------------------------------------------------------------------------+
| 版權所有 lamp兄弟連
+-----------------------------------------------------------------------------------------+
| 作者: 李捷 ([email protected])
| 最後修改時間: 2012-05-9 12:30
+-----------------------------------------------------------------------------------------+
*/
class LampDate{
private $start_year; //開始年份
private $start_month; //開始月份
private $start_day; //開始日期
private $end_year; //結束年份
private $end_month; //結束月份
private $end_day; //結束日期
private $start_time; //開始時間的時間戳
private $end_time; //結束時間的時間戳
//定義周表頭數組
private $week = array("星期一","星期二","星期三","星期四","星期五","星期六","星期日");
//開始時間月初的時間戳
private $start;
//開始時間月末的時間戳
private $end;
//樣式表CSS文件路徑
private $css;
//JS事件文件的路徑
private $script;
/**
* 日歷類構造方法
* @param start_year 開始年份
* @param start_month 開始月份
* @param start_day 開始日期
* @param end_year 結束年份
* @param end_month 結束月份
* @param end_day 結束日期
* @param css 輸出日期的樣式
* @param script 輸出日期的事件
*/
public function __construct($start_year='2012',$start_month='1',$start_day='1',$end_year='2012',$end_month='12',$end_day='31',$css='style.css',$script='js.js'){
$this->start_year = $start_year; //給開始年份賦值
$this->start_month = $start_month; //給開始月份賦值
$this->start_day = $start_day; //給開始日期賦值
$this->end_year = $end_year; //給結束年份賦值
$this->end_month = $end_month; //給結束月份賦值
$this->end_day = $end_day; //給結束日期賦值
$this->css = $css; //指定日期的CSS
$this->script = $script; //指定日期的JS事件
//獲取開始日期的時間戳
$this->start_time = strtotime($this->start_year."-".$this->start_month."-".$this->start_day);
//獲取結束日期的時間戳
$this->end_time = strtotime($this->end_year."-".$this->end_month."-".$this->end_day);
//獲取開始時間月初的時間戳
$this->start = strtotime($this->start_year."-".$this->start_month."-01");
//獲取開始時間月末的時間戳
$this->end = strtotime($this->end_year."-".$this->end_month."-".date("t",$this->end_time));
//獲取開始日期到結束日期的天數
$this->day_count = (($this->end)-($this->start))/(24*60*60);
}
/**
* 獲取每月表格的表頭
* @param i 從開始時間月初後的第幾天
* @return 返回表頭 --年--月
*/
private function get_caption($i){
//定義一個空字符串
$str ='';
$str.= "<table border='0' cellspacing='0' cellpadding='0'>";
$str.= "<tr>";
$str.= "<td colspan='7' align='center' height='30px' bgcolor='#5CACEE' style='color:white;font-weight:bold'>";
//獲取開始時間月初第i天後的年和月
$str.= date("Y",$this->start+($i*(24*60*60)))."年".date("m",$this->start+($i*(24*60*60)))."月";
$str.= "</td>";
$str.= "</tr>";
//返回表頭
return $str;
}
/**
* 輸出每月的星期表頭方法
* @return 返回星期表頭
*/
private function get_week(){
//定義一個空字符串
$str='';
$str.= "<tr bgcolor='#B0E0E6'>";
for($w=0;$w<7;$w++){
//遍歷輸出星期一至星期日
$str.= "<td height='30px' width='80px' align='center' style='position:relative'>".$this->week[$w];
if($w==5 || $w==6){
//如果為周六或周日,添加放假的小圖標
$str.= "<img src='jia.jpg' style='position:absolute;top:0;right:0;'></td>";
}
$str.= "</td>";
}
$str.= "</tr>";
//返回星期頭
return $str;
}
/**
* 補全月份前端的空格
* @param i 從開始時間月初後的第i天
* @return 返回補全的空格
*/
private function get_space_front($i){
//定義一個空字符串
$str='';
//如果從開始時間月初後的第i天為星期一,輸出一個tr換行
if(date("N",$this->start+($i*(24*60*60)))==1){
$str.= "<tr>";
}
//如果從開始時間月初後的第i天為該月的第一天,遍歷輸出空格
if(date("d",$this->start+($i*(24*60*60)))==1){
//星期n就輸出n-1個空格
for($m=1;$m<date("N",$this->start+($i*(24*60*60)));$m++){
$str.= "<td bgcolor='#EDEDED'> </td>";
}
}
//返回輸出的空格
return $str;
}
/**
* 補全月份後端的空格
* @param i 從開始時間月初後的第i天
* @return 返回補全的空格
*/
private function get_space_back($i){
//定義一個空字符串
$str='';
//如果從開始時間月初後的第i天的天數為該月的月末
if(date("ymd",$this->start+($i*(24*60*60)))==date("ymt",$this->start+($i*(24*60*60)))){
//星期n就輸出7-n個空格
for($w=date("N",$this->start+($i*(24*60*60)));$w<7;$w++){
$str.= "<td bgcolor='#EDEDED'> </td>";
}
}
//返回補全的空格
return $str;
}
/**
* 輸出當前日期
* @return 返回日期
*/
private function get_date($i){
//定義一個空字符串
$str='';
//如果從開始時間月初後的第i天為開始日期,輸出背景為#7CCD7C色的表格
if(date("Ymd",$this->start+($i*(24*60*60)))==$this->start_year.$this->start_month.$this->start_day){
$str.= "<td align='center' height='30px' bgcolor='#7CCD7C' style='color:white'>";
//如果從開始時間月初後的第i天為結束日期,輸出背景為#EE6363色的表格
}elseif(date("Ymd",$this->start+($i*(24*60*60)))==$this->end_year.$this->end_month.$this->end_day){
$str.= "<td align='center' height='30px' bgcolor='#EE6363' style='color:white'>";
//如果從開始時間月初後的第i天為當前日期,輸出背景為#EE2C2C色的表格
}elseif(date("ymd",$this->start+($i*(24*60*60)))==(date("ymd",time()))){
$str.= "<td align='center' height='30px' bgcolor='#EE2C2C' style='color:white'>";
//否則輸出無背景色的表格
}else{
$str.= "<td align='center' height='30px' class='date'>";
}
//輸出從開始時間月初後的第i天的日期
$str.= date("j",$this->start+($i*(24*60*60)));
$str.= "</td>";
//返回輸出的日期
return $str;
}
/**
* 輸出補全的空行
* @param i 從開始時間月初後的第i天
* @param t 每月輸出的行數
* @return 返回補全的空行
*/
private function get_rows($i,&$t){
//定義一個空字符串
$str='';
//如果從開始時間月初後的第i天為星期天
if(date("N",$this->start+($i*(24*60*60)))==7){
//換行
$str.= "</tr>";
//如果從開始時間月初後的第i天為本月的最後一天並且為周日
if(date("ymd",$this->start+($i*(24*60*60)))==date("ymt",$this->start+($i*(24*60*60))) && date("N",$this->start+($i*(24*60*60)))==7){
//行數自減
$t--;
}
//行數自加
$t++;
}
//如果從開始時間月初後的第i天為本月的最後一天並且此時的行數小於6
if(date("ymd",$this->start+($i*(24*60*60)))==date("ymt",$this->start+($i*(24*60*60))) && $t<6){
while($t<6){
//開始輸出換行
$str.= "<tr>";
for($n=1;$n<=7;$n++){
//輸出七個空格
$str.= "<td height='30px' bgcolor='#EDEDED'> </td>";
}
$str.= "</tr>";
//行數自加一
$t++;
}
}
//輸出補全的空行
return $str;
}
/**
* 結束表格的輸出
* @param i 從開始時間月初後的第i天
* @param t 日期表格的行數
* @return 結束表格
*/
private function get_endtab($i,&$t){
//定義一個空字符串
$str='';
//如果從開始日期後的第i天為本月最後一天
if(date("d",$this->start+($i*(24*60*60)))==date("t",$this->start+($i*(24*60*60)))){
//輸出結束表格
$str.= "</table>";
//並將行數計數器改為1
$t=1;
}
//返回結束表格
return $str;
}
/**
* 獲取輸出月份表格的樣式和事件
* @return 返回月份表格的樣式和事件
*/
private function get_style(){
$str = "<style type='text/css'>";
//以只讀方式打開css文件
$handle = fopen($this->css,'r');
//讀出來文件內容賦給一個變量
$str .= fread($handle,filesize($this->css));
fclose($handle);
$str .= "</style>";
$str .= "<script type='text/javascript'>";
//以只讀方式打開js文件
$handle = fopen($this->script,'r');
//讀出來文件內容賦給一個變量
$str .= fread($handle,filesize($this->script));
fclose($handle);
$str .= "</script>";
//返回文件內容
return $str;
}
/**
* 獲取日期表格
* @param i 從開始時間月初後的第i天,默認為0
* @return 返回日期表格
*/
public function get_datetab($i=0){
//獲取樣式和事件
$str = $this->get_style();
//按開始日期到結束日期的天數開始遍歷日期
for($i=0,$t=1;$i<=$this->day_count;$i++){
//如果為本月的第一天
if(date("d",$this->start+($i*(24*60*60)))==1){
//獲取表頭
$str.=$this->get_caption($i);
//獲取星期表頭
$str.=$this->get_week($i);
}
//補全表格前面的空格
$str.=$this->get_space_front($i);
//獲取日期
$str.=$this->get_date($i);
//補全表格後面的空格
$str.=$this->get_space_back($i);
//定義日期表格的行數
$str.=$this->get_rows($i,$t);
//結束表格
$str.=$this->get_endtab($i,$t);
}
//返回日期表格
return $str;
}
}
我裡面加了較全的注釋,大家有什麼不明白的地方可以跟帖回復提問,抑或我會在下一帖中再給大家詳細講解下大家共同遇到的問題,敬請期待....
輸出效果:
我把代碼發上來,大家可以下載研究下:
日歷代碼 date_class.rarhttp://bbs.lampbrother.net/job.php?action=download&aid=21095
作者 zdrjlamp