PHP提供了大量的內置函數,使開發人員在時間的處理上游刃有余,大大提高了工作效率。我們今天就為學員介紹一些常見的PHP日期和時間函數以及日期和時間的處理。
9.1 常用的日期和時間處理函數
表9-1:常用的日期和時間處理函數
函 數
說 明
checkdate
驗證時間函數,判斷時間是否有效,有效返回true,否則返回false
date_default_timezone_get
取得腳本日期時間函數所使用的默認時區
date_default_timezone_set
設定日期時間函數的默認時區
date
格式化一個本地時間/日期
getdate
獲取日期/時間信息
gettimeofday
獲取當前時間
localtime
獲取本地時間
microtime
返回當前時間戳和微秒數
mktime
取得一個UNIX時間戳
strtotime
將任何英文文本的日期時間描述解析為UNIX時間戳
time
返回當前的UNIX時間戳
9.2 處理日期和時間
9.2.1獲取當前日期和時間:date()函數,用法:
date(string format,int timestamp)
該函數將返回參數timestamp按照指定格式而產生的字符串。其中參數timestamp是可選的,如果省略,則使用當前時間。format參數可以使開發人員按其指定的格式輸出時間日期。
date_default_timezone_set(PRC); //設置北京時間.
1. 年-月-日
echo date('Y-m-j'); //例:2007-02-6
echo date('y-n-j'); //例:07-2-6
大寫Y表示年四位數字,而小寫y表示年的兩位數字;
小寫m表示月份的數字(帶前導),而小寫n則表示不帶前導的月份數字。
echo date('Y-M-j'); //例:2007-Feb-6
echo date('Y-m-d'); //例:2007-02-06
大寫M表示月份的3個縮寫字符,而小寫m則表示月份的數字(帶前導0);
沒有大寫的J,只有小寫j表示月份的日期,無前導o;若需要月份帶前導則使用小寫d。
echo date('Y-M-j'); //例:2007-Feb-6
echo date('Y-F-jS'); //例:2007-February-6
大寫M表示月份的3個縮寫字符,而大寫F表示月份的英文全寫。(沒有小寫f)
大寫S表示日期的後綴,比如“st”、“nd”、“rd”和“th”,具體看日期數字為何。
小結:
表示年可以用大寫的Y和小寫y;
表示月可以用大寫F、大寫M、小寫m和小寫n(分別表示字符和數字的兩種方式);
表示日可以用小寫d和小寫j,大寫S表示日期的後綴。
2,時:分:秒
默認情況下,PHP解釋顯示的時間為“格林威治標准時間”,與我們本地的時間相差8個小時。
echo date('g:i:s a'); //例:5:56:57 am
echo date('h:i:s A'); //例:05:56:57 AM
小寫g表示12小時制,無前導0,而小寫h則表示有前導0的12小時制。
當使用12小時制時需要表明上下午,小寫a表示小寫的“am”和“pm”,大寫A表示大寫的“AM”和“PM”。
echo date('G:i:s');14:02:26
大寫G表示24小時制的小時數,但是不帶前導的;使用大寫的H表示帶前導的24小時制小時數
小結:
字母g表示小時不帶前導,字母h表示小時帶前導;
小寫g、h表示12小時制,大寫G、H表示24小時制。
3,閏年、星期、天
大寫L表示判斷今年是否閏年,布爾值,為真返回1,否則為0;
小寫l表示當天是星期幾的英文全寫(Tuesday);
而使用大寫D表示星期幾的3個字符縮寫(Tue)。
echo date('w'); //例:今天星期:2
echo date('W'); //例:本周是全年中的第06 周
小寫w表示星期幾,數字形式表示
大寫W表示一年中的星期數
echo date('t'); //例:本月是28 天
echo date('z'); //例:今天是今年的第36 天
小寫t表示當前月份又多少天
小寫z表示今天是本年中第幾天
4,其他
echo date('T'); //例:UTC
大寫T表示服務器的時間區域設置
echo date('I'); //例:0
大寫I表示判斷當前是否為夏令時,為真返回1,否則為0
echo date('U'); //例:1170769424
大寫U表示從1970年1月1日到現在的總秒數,就是Unix時間紀元的UNIX時間戳。
echo date('c'); //例:2007-02-06T14:24:43+00:00
小寫c表示ISO8601日期,日期格式為YYYY-MM-DD,用字母T來間隔日期和時間,時間格式為HH:MM:SS,時區使用格林威治標准時間(GMT)的偏差來表示。
echo date('r'); //例:Tue, 06 Feb 2007 14:25:52 +0000
小寫r表示RFC822日期。
9.2.2獲取日期信息:getdate()函數
語法:
array getdate(int timestamp)
該函數返回數組形式的日期時間信息,如果沒有時間戳,則以當前時間為准。該函數返回的關聯數組元素的說明如表9-2所示:
表9-2:getdate()函數返回的關聯數組元素說明
元 素
說 明
seconds
秒,返回值0~59
minutes
分鐘,返回值為0~59
hours
小時,返回值為0~23
mday
月份中第幾天,返回值為1~31
wday
星期中第幾天,返回值為0(星期天)~6(星期六)
mon
月份數字,返回值為1~12
year
4位數字表示的完整年份,返回值加2000或2008
yday
一年中第幾天,返回值0~365
weekday
星期幾的完整文本表示,返回值為Sunday~Saturday
month
月份的完整文本表示,返回值為January~December
0
返回從UNIX紀元開始的秒數
例:
<?php
$arr = getdate();
echo $arr[year]."-".$arr[mon]."-".$arr[mday]."";
echo $arr[hours].":".$arr[minutes].":".$arr[seconds]."".$arr[weekday];
echo "<p>";
echo "Today is the $arr[yday]th of year";
?>
效果:
9.3 UNIX時間戳
時間戳是文件屬性中的創建、修改、訪問時間。數字時間戳服務(digital time stamp service, DTS)是web網站安全服務項目之一,能提供電子文件的日期和時間信息的安全保護。
9.3.1 什麼是時間戳
時間戳是一個經加密後形成後的憑證文檔,它包括3個部分:
² 需要添加時間戳的文件用Hash編碼加密形成摘要。
² DTS接受文件的日期和時間信息。
² 對接受的DTS文件加密。
數字時間是由認證單位DTS來添加的,以DTS接收到文件的時間為依據。
時間戳的作用原理是通過其他加密法將時間的數值轉換為加密的數值,時間變化後加密的數值也隨之變化。
時間戳的優點是:變化的加密數值來防止數值被竊取後非法重復利用,也就起到了加密的作用。時間戳主要依賴於時間,在約定的一段時間內產生唯一的一個數值。
9.3.2獲取本地時間戳:mktime()函數
語法:
int mktime(int hour, int minute, int month, int day, int year, int [is_dst])
表9-3:mktime()函數的參數說明
參 數
說 明
hour
小時數
minute
分鐘數
second
秒數(一分鐘之內)
month
月份數
day
天數
year
年份數
is_dst
參數is_dst在夏令時可以被設置為1,如果不是則設置為0;如果不確定是否為夏令時則設置為-1(默認值)
注意:有效的時間戳典型范圍是格林尼治時間1901年12月13日20:45:54~2038年1月19日03:13:07(此范圍符合32位有符號整數的最小值和最大值)。在Windows系統中此范圍限制為從1970年1月1日~2038年1月19日。
例:
<?php
echo "mktime函數返回的時間戳:".mktime()."<p>";
echo "當前的日期為:".date("Y-m-d",mktime())."<p>";
echo "當前的時間是:".date("H:i:s",mktime());
?>
效果:
9.4 系統時區設置
很多學員在學習過程中發現通過date()函數獲取到的時間跟本地時間不一樣,這是由於PHP5對date()函數進行了重寫,因此,目前的日期時間函數比系統時間少8個小時。在PHP語言中默認設置的是標准的格林威治時間(即采用的是零時區)。
更改PHP語言中的時區設置主要有以下兩種方法:
1. 修改php.ini文件中的設置,找到[date]下的;date.timezone = 選項,將該項修改為date.timezone=Asia/Hong_Kong,然後重新啟動apache服務器。
2. 在應用程序中,使用時間日期函數之前添加如下函數:
date_default_timezone_set(“Asia/Hong_Kong”);
設置完成後,date()函數就可以正常使用了,不會再出現時差問題。
9.5 時間開發中遇到的日期和時間問題
9.5.1比較兩個時間的大小
在實際開發中經常遇到判斷兩個時間的大小,PHP中的時間是不可以直接來進行比較的。所以,首先要將時間輸出為時間戳的格式,然後再進行比較,這是常用到的方法。
有兩個函數都可以實現這個功能,這裡使用strtotime()函數,該函數可以將任何英文文本的日期時間描述解析為UNIX時間戳。該函數的語法為:
int strtotime(string time, int now)
該函數有兩個參數。如果參數time的格式是絕對時間,則now參數不起作用;如果參數time的格式是相對時間,那麼其對應的時間就是參數now來提供的,如果沒有提供參數now,對應的時間就是當前時間。如果解析失敗,則返回-1.
例:
<?php
$time1 = date("Y-m-d H:i:s"); //獲取當前時間
$time2 = "2008-2-3 16:30:00"; //給變量$time2設置一個時間
echo "變量/$time1的時間為:".$time1."<br>"; //輸出兩個時間變量
echo "變量/$time2的時間為:".$time2."<br>";
if (strtotime($time1)-strtotime($time2)<0) { //對兩個時間進行比較
echo "/$time1早於/$time2"; //如果time1-time2<0說明time1的時間在前
}else{
echo "/$time2早於/$time1"; //否則,說明time2的時間在前
}
?>
效果:
9.5.2 計算兩個日期的差值
strtotime()函數除了可以比較兩個日期的大小,還可以精確地知道兩個日期的差值。下面通過一個倒計時的小程序來為學員們講解如何用strtotime()函數來計算兩個日期的差值。
<?PHP
$time1 = strtotime(date( "Y-m-d H:i:s"));
$time2 = strtotime("2008-2-3 17:10:00");
$time3 = strtotime("2008-8-8");
$sub1 = ceil(($time2 - $time1) / 3600); //60 * 60
$sub2 = ceil(($time3 - $time1) / 86400); //60 * 60 * 24
echo "離放假還有<font color=red> $sub1 </font>小時!!!" ;
echo "<p>";
echo "離北京奧運開幕還有<font color=red>$sub2 </font>天!!!";
?>
效果:
9.5.3計算頁面腳本的運行時間
在浏覽網站時,經常會用到搜索引擎,在搜索信息時,細心的用戶會發現,在搜索結果的最下方,一般都有“搜索時間為……秒”的字樣。
這裡使用到了microtime()函數,該函數返回當前UNIX時間戳和微秒數。返回格式為msec sec的字符串,其中sec是當前的UNIX時間戳,msec為微秒數。該函數的格式為:
string microtime(void)
下面我們來計算一下上例的運行時間,代碼如下:
<?php
function run_time()
{
list($msec, $sec) = explode(" ", microtime());
return ((float)$msec + (float)$sec);
}
$start_time = run_time();
$time1 = strtotime(date( "Y-m-d H:i:s"));
$time2 = strtotime("2008-2-3 17:10:00");
$time3 = strtotime("2008-8-8");
$sub1 = ceil(($time2 - $time1) / 3600); //60 * 60
$sub2 = ceil(($time3 - $time1) / 86400); //60 * 60 * 24
echo "離放假還有<font color=red> $sub1 </font>小時!!!" ;
echo "<p>";
echo "離北京奧運開幕還有<font color=red>$sub2 </font>天!!!";
$end_time = run_time();
?>
<p>
該示例的運行時間為<font color=blue> <?php echo ($end_time - $start_time); ?> </font>秒