PHP提供了大量的內建函數,使開發人員在時間的處理上遊刃有餘,大大提高了工作效率。介紹一些常見的PHP日期和時間函數以及日期和時間的處理。
常用的日期和時間處理函數
| 函 數 |
說 明 |
| checkdate |
驗證時間函數,判斷時間是否有效,有效返回true,否則返回false |
| date_default_timezone_get |
取得指令碼日期時間函數所使用的預設時區 |
| date_default_timezone_set |
設定日期時間函數的預設時區 |
| date |
格式化一個本地時間/日期 |
| getdate |
擷取日期/時間資訊 |
| gettimeofday |
擷取目前時間 |
| localtime |
擷取本地時間 |
| microtime |
返回目前時間戳和微秒數 |
| mktime |
取得一個UNIX時間戳記 |
| strtotime |
將任何英文文本的日期時間描述解析為UNIX時間戳記 |
| time |
返回當前的UNIX時間戳記 |
系統時區設定
在學習過程中發現通過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()函數就可以正常使用了,不會再出現時差問題。
UNIX時間戳記
時間戳記是檔案屬性中的建立、修改、訪問時間。數字時間戳記服務(digital time stamp service, DTS)是web網站安全服務項目之一,能提供電子檔案的日期和時間資訊的安全保護。
時間戳記是一個經加密後形成後的憑證文檔,它包括3個部分:
² 需要新增時間戳記的檔案用Hash編碼加密形成摘要。
² DTS接受檔案的日期和時間資訊。
² 對接受的DTS檔案加密。
數字時間是由認證單位DTS來添加的,以DTS接收到檔案的時間為依據。時間戳記的作用原理是通過其他加密法將時間的數值轉換為加密的數值,時間變化後加密的數值也隨之變化。時間戳記的優點是:變化的加密數值來防止數值被竊取後非法重複利用,也就起到了加密的作用。時間戳記主要依賴於時間,在約定的一段時間內產生唯一的一個數值。
mktime()函數
文法:
int mktime(int hour, int minute, int month, int day, int year, int [is_dst])
| 參 數 |
說 明 |
| 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日。
date()函數
date(string format,int timestamp)
該函數將返回參數timestamp按照指定格式而產生的字串。其中參數timestamp是可選的,如果省略,則使用目前時間。format參數可以使開發人員按其指定的格式輸出時間日期。
date_default_timezone_set(PRC); //設定北京時間.
| 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 到 365 |
| 星期 |
--- |
--- |
| 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> |
| u |
毫秒 (PHP 5.2.2 新加)。需要注意的是 date() 函數總是返回 000000 因為它只接受 integer 參數, 而 DateTime::format() 才支援毫秒。 |
樣本: 654321 |
| 時區 |
--- |
--- |
| 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 下為完整文字格式設定,例如"Eastern Standard 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)開始至今的秒數 |
參見 time() |
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中的時間是不可以直接來進行比較的。所以,首先要將時間輸出為時間戳記的格式,然後再進行比較,這是常用到的方法。
有兩個函數都可以實現這個功能,這裡使用strtotime()函數,該函數可以將任何英文文本的日期時間描述解析為UNIX時間戳記。 該函數的文法為:
int strtotime(string time, int now)
該函數有兩個參數。如果參數time的格式是絕對時間,則now參數不起作用;如果參數time的格式是相對時間,那麼其對應的時間就是參數now來提供的,如果沒有提供參數now,對應的時間就是目前時間。如果解析失敗,則返回-1.
計算頁面指令碼的已耗用時間
在瀏覽網站時,經常會用到搜尋引擎,在搜尋資訊時,細心的使用者會發現,在搜尋結果的最下方,一般都有“搜尋時間為……秒”的字樣。這裡使用到了microtime()函數,該函數返回當前UNIX時間戳記和微秒數。返回格式為msec sec的字串,其中sec是當前的UNIX時間戳記,msec為微秒數。該函數的格式為:
string microtime(void)
無標題文檔 "; // 目前時間到UNIX紀元的差值 echo time()."
"; // 格式化時間 echo date("Y-m-d H-i-s")."
"; // 時間數組 $arrays = getdate(); print_r($arrays)."
"; // 檢測時間 var_dump( checkdate(7, 9, 2015) ); "
"; // 本地化時間戳記,strtotime還可用於時間的大小比較 setlocale(LC_TIME, 0); echo strftime('%Y,%m,%d', strtotime('2000-04-00'))."
"; // 微妙 echo microtime(true); 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 "離放假還有 $sub1 小時!!!" ; echo ""; echo "離北京奧運開幕還有$sub2 天!!!"; $end_time = run_time(); echo '耗時'.($end_time - $start_time); ?>
來自:http://blog.csdn.net/aoshilang2249/article/details/46822105