8.3.4 時間日期函數
8.3.4.1 時間日期函數概述
時間日期函數用來獲取服務器的時間和日期,或對(duì)時間日期類型的數據進(jìn)行各種(zhǒng)處理,來滿足程序的需要。在編程中時常要用到時間日期,如信息發(fā)布時記錄發(fā)布的時間,用戶注冊時要記錄注冊的時間,記錄用戶進(jìn)行某些操作的時間等。PHP 5提供的時間日期函數如表8-3所示:
通過(guò)表8-3可以看到,PHP提供了很多函數實現各種(zhǒng)時間/日期操作。其中不乏很有趣的函數,如返回某給定日期與地點的日出/日落時間。不過(guò)其中部分函數并沒(méi)有很大的實用價值,隻需要熟練掌握其中幾個函數的使用,即可實現絕大多數常見的應用。
8.3.4.2 獲取當前時間的Unix時間戳
很多讀者可能(néng)不明白什麼(me)是Unix時間戳。Unix時間戳是指從Unix紀元(格林威治時間1970年1月1日00時00分00秒)開(kāi)始到當前時間爲止相隔的秒數。因此很顯然Unix時間戳應該代表一個很大的整數。Unix時間戳在很多時候非常有用,尤其在對(duì)時間進(jìn)行加減時作用最爲明顯。如當前時間是“2006年10月10日10點10分10秒”,在這(zhè)個時間基礎上加上25天8小時55分58秒,會得到一個什麼(me)時間呢?可能(néng)推算起(qǐ)來比較複雜。因爲除了時間進(jìn)位以外,還(hái)涉及到不同月份天數可能(néng)不同(可能(néng)是28天、29天、30天、31天)。所以用數學(xué)方法直接加減是不行的。如果使用Unix時間戳,在第一個時間的基礎上加上一定的秒數,得到的就是第二個時間的Unix時間戳。然後(hòu)用PHP的有關函數把這(zhè)個時間戳轉換成(chéng)普通時間格式顯示即可。
PHP中提供了time()函數來直接獲取當前時間的Unix時間戳。
1: <!--文件8-17.php:獲取Unix時間戳-->
2: <HTML>
3: <HEAD>
4: <TITLE>獲取Unix時間戳</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $tm= time();
9: echo "當前時間的Unix時間戳爲:".$tm;
10: ?>
11: </BODY>
12: </HTML>
本程序運行結果如圖8-15所示。
圖8-15 程序8-17.php的運行結果
圖中的數字1206419093表示的是從1970年1月1日0點0分0秒到本程序執行時相隔的秒數。如果每隔一段時間刷新一下頁面(miàn),會發(fā)現時間戳的值每次都(dōu)會變化。因爲每過(guò)一秒鍾,這(zhè)個數字就增加1。每次刷新頁面(miàn)都(dōu)會重新調用程序,都(dōu)會獲得一個不同的時間,因此Unix時間戳在不斷變化。具體的說,這(zhè)個數字在不斷增大。
8.3.4.3 獲取指定時間的Unix時間戳
能(néng)不能(néng)獲得一個指定時間的Unix時間戳呢?也就是說要獲得的時間戳不是當前時間的,而是一個固定時間的。PHP給提供了mktime()函數和strtotime()函數來完成(chéng)這(zhè)個操作。
mktime()函數的格式如下:
int mktime ( [int hour [, int minute [, int second [, int month [, int day [, int year]]]]]] )
本函數的作用是根據給出的參數返回Unix時間戳。6個參數全都(dōu)是整數,分别代表小時、分鍾、秒、月、日、年。參數可以從右向(xiàng)左省略,任何省略的參數會被設置成(chéng)本地日期和時間的當前值。當全部參數都(dōu)被省略時,獲得的就是當前時間的Unix時間戳。
另外strtotime()函數允許使用一個時間字符串作爲參數來獲取Unix時間戳。這(zhè)個時間串的順序與中文習慣較爲吻合。如“2000-11-12 10:34:55”表示2000年11月12日10時34分55秒。該字符串指代了一個具體的時間,可以作爲strtotime()函數的參數,來獲得這(zhè)個時間的Unix時間戳。
1: <!--文件8-18.php:獲取指定時間的Unix時間戳-->
2: <HTML>
3: <HEAD>
4: <TITLE>獲取指定時間的Unix時間戳</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: //用mktime()返回時間戳
9: $tm= mktime(23,56,59,12,20,1999);
10: echo "1999年12月20日23點56分59秒的Unix時間戳爲:".$tm;
11: //用strtotime()返回時間戳
12: $tm2= strtotime("1999-12-20 23:56:59");
13: echo "<br>用strtotime獲得的同一時間的時間戳:".$tm2;
14: ?>
15: </BODY>
16: </HTML>
本程序運行結果如圖8-16所示。
圖8-16 程序8-18.php的運行結果
程序8-18.php用mktime函數將(jiāng)一個指定時間格式化爲Unix時間戳。然後(hòu)用strtotime函數同樣格式化這(zhè)個時間,不過(guò)用一個字符串而不是6個數字作爲參數。運行結果顯示兩(liǎng)個函數的返回結果完全相同。刷新頁面(miàn)時,時間戳值都(dōu)不會發(fā)生變化。因爲這(zhè)個時間戳是一個固定的時間,不會随當前時間變化而變化。
有的讀者可能(néng)會問一個問題:如果我使用mktime函數時提供的參數不符合常規,會出現什麼(me)情況呢?比如每年最多有12個月,不可能(néng)有14月,如果給月份這(zhè)個參數提供一個14,會怎樣呢?實際上,PHP會把某年的14月作爲下一年的2月。如1999年14月會被認爲是2000年2月。同理如果時間設置爲23分70秒,那PHP會作爲24分10秒來處理。讀者可以自行編制程序進(jìn)行測試。
8.3.4.4 取得時間日期信息
前面(miàn)學(xué)習了如何獲得一個時間的Unix時間戳。雖然用Unix時間戳有利于在計算機中進(jìn)行時間的計算,但是在顯示時間時還(hái)是應該顯示成(chéng)通用的“年月日時分秒”以及星期幾等格式,而不是直接輸出一個Unix時間戳。PHP中提供了date()和getdate()等函數來實現從Unix時間戳到通用時間日期的轉換。
1.getdate()函數
getdate()函數用來將(jiāng)一個Unix時間戳格式化成(chéng)具體的時間日期信息,其使用格式如下:
array getdate ( [int timestamp] )
其中參數timestamp就是一個Unix時間戳。如果不指定參數,則默認使用當前時間。該函數返回一個數組,數組中存放了詳細的時間信息。通過(guò)數組下标可以取得數組中的元素值。其下标與值得對(duì)應關系如表8-4所示。
下面(miàn)我們看一個例子,來全面(miàn)展示該函數的強大功能(néng)。
1: <!--文件8-19.php:getdate()函數獲取詳細的時間信息-->
2: <HTML>
3: <HEAD>
4: <TITLE>getdate()函數獲取詳細的時間信息</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: //首先假設一個時間
9: $dt= "2007-07-01 08:30:00";
10: echo "時間:".$dt."<br>";
11: //將(jiāng)此時間格式化爲Unix時間戳
12: $tm= strtotime($dt);
13: echo "此時間的Unix時間戳:".$tm."<br>";
14: //獲取該時間的詳細信息
15: $arr = getdate($tm);
16: //輸出詳細信息
17: echo "秒:".$arr["seconds"]."<br>";
18: echo "分:".$arr["minutes"]."<br>";
19: echo "時:".$arr["hours"]."<br>";
20: echo "日:".$arr["mday"]."<br>";
21: echo "月:".$arr["mon"]."/".$arr["month"]."<br>";
22: echo "年:".$arr["year"]."<br>";
23: echo "星期:".$arr["wday"]."/".$arr["weekday"]."<br>";
24: echo "該日期是該年中的第".$arr["yday"]."天<br>";
25: ?>
26: </BODY>
27: </HTML>
本程序中,第9行設置了一個時間,第12行將(jiāng)此時間格式化成(chéng)UNIX時間戳。第15行將(jiāng)此時間戳用getdate()函數獲取詳細時間信息。然後(hòu)在第17~24行分别輸出了全部的時間信息。程序的輸出結果如圖8-17所示。
圖8-17 程序8-19.php的運行結果
本程序中假定日期爲“2007-07-01 08:30:00”,實際上可以直接用語句“$arr = getdate();”來獲得當前時間的詳細信息。這(zhè)時輸出的時間信息就是當前程序執行時的時間信息。感興趣的讀者可以自行測試。
2.date()函數
date()函數用來將(jiāng)一個Unix時間戳格式化成(chéng)指定的時間/日期格式。getdate()函數可以獲取詳細的時間信息,但是很多時候并不是要取得如此具體的時間信息,而是將(jiāng)一個Unix時間戳所代表的時間按照某種(zhǒng)容易識讀的格式輸出。這(zhè)就需要用到date()函數。該函數的使用格式是:
string date ( string format [, int timestamp] )
該函數直接返回一個字符串。這(zhè)個字符串就是一個指定格式的日期時間。參數format是一個字符串,用來指定輸出的時間的格式。可選參數timestamp是要處理的時間的Unix時間戳。如果參數爲空,那麼(me)默認值爲當前時間的Unix時間戳。
本函數的重點是學(xué)習如何使用format參數。format參數必須由指定的字符構成(chéng),不同的字符代表不同的特殊含義,如表8-5所示。
表8-5中列出了絕大部分format參數字符,個别極爲不常用的沒(méi)有列出。通過(guò)表8-5已經(jīng)看出format字符數量衆多,涉及方方面(miàn)面(miàn)。date()函數可以完成(chéng)的功能(néng)極爲豐富。
下面(miàn)我們通過(guò)一個例子來看這(zhè)些format字符如何使用。
1: <!--文件8-20.php:用格式化字符串輸出時間信息-->
2: <HTML>
3: <HEAD>
4: <TITLE>用格式化字符串輸出時間信息</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: //設置一個時間(如采用當前時間可用time())
9: $tm = strtotime("2008-09-09 10:30:40");
10: echo "初始化設置的時間爲:2008-09-09 10:30:40<br>";
11: //使用不同的格式化字符串測試輸出效果
12: echo date("Y-M-D H:I:S A",$tm)."<br>";
13: echo date("y-m-d h:i:s a",$tm)."<br>";
14: echo date("Y年m月d日[l] H點i分s秒",$tm)."<br>";
15: echo date("F,d,Y l",$tm)."<br>";
16: echo date("Y-M-D H:I:S",$tm)."<br>";
17: echo date("Y-M-D H:I:S",$tm)."<br>";
18: echo date("所在時區:T,與格林威治時間相差:O小時",$tm)."<br>";
19: //輸出詳細信息
20: ?>
21: </BODY>
22: </HTML>
本程序的運行結果如圖8-18所示。
圖8-18 程序8-20.php的運行結果
通過(guò)程序8-20.php可以看出,格式化字符串的使用非常靈活。隻要在字符串中包含相關字符,date函數就能(néng)把這(zhè)些字符替換成(chéng)指定的時間日期信息。可以利用這(zhè)個函數随意輸出需要的時間日期格式。
程序的最後(hòu)一條輸出用的是格式字符“T”和“O”來輸出運行本程序的服務器所處的時區以及本時區和格林威治标準時間相差的小時數。程序輸出時區爲UTC,相差時間爲0小時。這(zhè)雖然與世界标準時區和時間相符,但是并不是本地的時間。如北京時間要比格林威治時間晚8個小時,因此在取得的本地時間基礎上再增加8個小時才是北京時間。增加8個小時的方法很簡單,在已經(jīng)取得的當前時間的Unix時間戳上加8*60*60即是8小時之後(hòu)的時間戳。如果讀者在編寫程序時發(fā)現程序獲得的時間與北京時間不符,應該考慮是否是時區問題,對(duì)取得的時間進(jìn)行相應處理即可。
PHP的時間日期函數很常用,但并不複雜。讀者一般隻需要掌握Unix時間戳的獲得和操作方法和格式化字符的使用方法,即可輕松掌握PHP時間日期的處理。
老師做這(zhè)些很辛苦,而我們從老師的辛苦中學(xué)到了不少
老師講解詳細,需要好(hǎo)好(hǎo)學(xué)習
老師講的很詳細,從中學(xué)到很多。