本文包含以下內容:
1、 得到目前的日期和時間-我們有多少種方式?
2、 改變日期顯示的方式-日期和時間的顯示形式
3、 轉換現在的日期為Unix的時間戳值
4、 改變日期
a. 增加時間
b. 減去時間
c. 找出兩日期之間的間隔
5、 為PHP添加DateAdd函數
6、 為PHP添加DateDiff函數
**得到目前的日期和時間
在Unix中,時間的表示方式為計算從1970年1月1日零時起所過去的秒數,這稱為UNIX 時間戳(Unix Epoch)。
如果我們有這樣一段的代碼:
1.<? 2.echo time(); 3.? > 將返回值958905820,而此時的時間為2000年5月21日12時43分。
你也許會說這相當不錯。當這對我毫無幫助,或者只有一點幫助。在PHP中,對日期處理的函數都必須用到由time()返回的時間戳值。同時,由於PHP在Unix和Windows系統中均使用同樣的時間戳值,這就允許你不需要修改代碼即可在不同的系統間移植。另外的一個好處是time()函數返回的是一個整數,你可以將其作為整數字段或文本字段存入數據庫,而不必使用特別的日期/時間字段。
你已經基本了解了Unix的時間戳值,現在讓我們來展示它的實際用途。
改變日期顯示的方式-日期和時間的顯示形式
PHP提供兩個辦法來將Unix的時間戳值轉換成為有用的數據。第一個是date()函數。這個函數有兩個參數-第一個字符串用於設定你所希望返回的格式,第二個為Unix的時間戳值。
格式化字符串通過一些簡單的特殊格式化字符來顯示你所希望看到的格式的日期和時間。假設你希望日期以這樣的格式顯示“18h01 Sunday 21 May”。
我們需要對字符串中的每一部分使用一個特殊格式化字符,你可以從PHP手冊中日期和時間函數庫中找到。這樣的特殊格式化字符數量不少,他們所表示的類似於星期幾、月的英文名、用2位或4位數表示的年份,是否是上午(AM)或下午(PM)以及其他。對於這個例子我們需要的特殊字符為:
‘H’ -24 小時制的小時
‘i’- 分鐘
‘l’- 星期幾的英文全名
‘d’- 本月的第幾日
‘F’- 月份的英文全名
因此我們的格式化字符串為”Hhi l d F”, PHP代碼為:
1. <? 2.echo date ("Hhi l d F" ,time()); 3.? > 當我們執行這段代碼,我們發現我們所得到的結果為: 180609 Sunday 21 May
這樣的結果看起來有些奇怪。讓我們再查一下PHP手冊,原來’h’所代表的是12 小時制的小時數。這再次證明了一句真理:“計算機只做你所告訴它該做的,而不是你想要它做的”。我們有兩個選擇。第一個是在h前使用轉義字符“”:echo date ("Hhi l d F", time());
我們得到這樣的結果:18h12 Sunday 21 May
這正是我們所要的。但如果我們在一個十分復雜的句子中需要包含日期和時間,我們是否需要對每個字符使用轉義字符? 答案當然是不。我們使用另一個函數strftime()。
strftime()有兩個好處。第一個好處我們並不在本文討論范圍內-如果你使用setlocale()函數,你可以通過strftime得到相應語言的月份的名稱。另外的一個好處是你可以將特別的日期和時間的格式化字符包含在你的字符串中。這同時也意味著無論你是否要學習date()函數的所有特殊格式化字符,你都必須學習一整套完全不同的格式化字符。
strftime()工作的方式和date()沒有什麼不同,除了特殊格式化字符的前面必須添加一個百分號%。如果用strftime()函數,前面例子的代碼如下:
1.<? 2.echo strftime ("%Hh%M %A %d %b" ,time()); 3.? > 結果為:18h24 Sunday 21 May
這也許看起來將簡化繁,但考慮一下如果你所需要的顯示的為"Today is Sunday 21 May 2000. The time is somewhere close to 18h24." 我想使用date()函數無疑令人感到厭煩。
在開始的時候,我提及我們有兩種方式可以從Unix時間戳值中得到有用的數據。我們剛剛了解了date()和strftime()。另一個getdate()。這個函數只需要Unix 的時間戳值作為參數,而函數的返回值為日期和時間的數組。
下面是一個例子:
1.<? 2.$date_time_array = getdate (time()); 3.echo $date_time_array[ "weekday"]; 4.? > 返回的結果為:Sunday
除了"weekday",該數組的其他部分為:
"seconds" –秒
"minutes" –分
"hours" –小時
“mday" - 本月的第幾天
"wday" -本周的第幾天(數字)
"mon" -月(數字)
"year" –年
"yday" - r本年的第幾天(數字)
"month" -月份全名
我們現在可以得到容易辨認的日期和時間。那麼其他呢?
**轉換現在的日期為Unix的時間戳值
通常你必須處理一些日期或時間格式的數據。打開M$的一個Access數據庫,所有的日期都以YYYY/MM/DD的格式存儲,加入目前的日前即為2000/05/27。Mktime()函數可以將一個時間轉換成Unix的時間戳值。
函數的格式為:int mktime(int hour, int minute, int second, int month, int day, int year, int [is_dst] );
從左往右你必須提供小時、分、秒、月、天和年。最後一個參數用於指定你是否處於夏令時,此參數是可選的,所以我們將忽略它。
代碼如下:
1.<? 2.echo mktime (0, 0,0 ,5, 27,2000 ); 3.? > 由於不知道小時、分和秒同時這些參數必須填寫,我將其設置為0。設置為0意味著時間為午夜。
1.<? 2.$access_date = "2000/05/27"; 3.//explode()函數用一個字符串作為分界來分解另一個字符串。這個例子$access_date通過字符串”/”來分解 4.$date_elements = explode("/" ,$access_date); 5.// 此時 6.// $date_elements[0] = 2000 7.// $date_elements[1] = 5 8.// $date_elements[2] = 27 9.echo mktime (0, 0,0 ,$date_elements [1], $date_elements[ 2],$date_elements [0]); 10.? > 我們看一個比從Access數據庫單純獲得日期更復雜的情況,我們得到一個以下格式的日期和時間:2000/05/27 02:40:21 PM
1.<? 2.// 來自Access的字符串 3.$date_time_string = "2000/05/27 02:40:21 PM"; 4.// 將字符串分解成3部分-日期、時間和上午/下午 5.$dt_elements = explode(" " ,$date_time_string); 6.// 分解日期 7.$date_elements = explode("/" ,$dt_elements[ 0]); 8.// 分解時間 9.$time_elements = explode(":" ,$dt_elements[ 1]); 10.// 如果是下午,我們將時間增加12小時以便得到24小時制的時間 11.if ($dt_elements [2]== "PM") { $time_elements[ 0]+=12;} 12.// 輸出結果 13.echo mktime ($time_elements [0], $time_elements[ 1], $time_elements[ 2], $date_elements[1], $date_elements[2], $date_elements[0]); 14.? >
*修改日期
有時我們需要知道6小時以後是什麼時間,35天前的日期或者從你最後一次玩Quake3後已過去多少秒。我們已經知道如何用mktime()函數從單獨的日期和時間中獲得Unix的時間戳值。如果我們需要的並非目前日期和時間的Unix時間戳值,我們該咋辦?下面是一些練習可以幫助說明我們後面所要做的。
正如前面所見,mktime()使用以下參數:小時、分、秒、月、天和年。想想第二節,getdate()函數可以為我們獲得這些參數。
1.<? 2.// 將目前的時間戳值放入一數組內 3.$timetimestamp = time(); 4.echo $timestamp; 5.echo "p"; 6.$date_time_array = getdate( $timestamp); 7.// 用mktime()函數重新產生Unix時間戳值 8.$timestamp = mktime($date_time_array ["hours"], $date_time_array["minutes" ],$date_time_array[ "seconds"],$date_time_array ["mon"], $date_time_array["mday" ],$date_time_array[ "year"]); 9.echo $timestamp; 10.? > 看起來有一些令人感到迷惑。我將用一些變量來使上面的程序看起來更容易了解。
1.<? 2.// 將目前的時間戳值放入一數組內 3.$timetimestamp = time(); 4.echo $timestamp; 5.echo "p"; 6.$date_time_array = getdate( $timestamp); 7.$hours = $date_time_array[ "hours"]; 8.$minutes = $date_time_array["minutes"]; 9.$seconds = $date_time_array[ "seconds"]; 10.$month = $date_time_array["mon"]; 11.$day = $date_time_array["mday"]; 12.$year = $date_time_array["year"]; 13.// 用mktime()函數重新產生