PHP中關于時間(戳)、時區、本地時間、UTC時間等的梳理
在PHP開發中,我們經常會在時間問題上被搞糊涂,比如我們希望顯示一個北京時間,但是當我們使用date函數進行輸出時,卻發現少了8個小時。幾乎所有的php猿類都必須對php中幾個重要的時間轉換等方法進行研究。本文就來梳理這些問題。
時間戳(timestamp)
GMT
在時間戳這個點上,它是一個概念,而不是具體的編程問題,是計算機世界通用的一種約定。時間戳是指格林尼治時間(GMT)1970年01月01日00時00分00秒到當前時間的總秒數。
GMT(也被稱為世界時)是固定為本初子午線經過地區的時間,因此被作為時間參照物。
UTC
協調世界時(UTC)和GMT一樣都是一種時間的參照物,但是他們的計算方法不同UTC是以原子時秒長為基礎,在時刻上盡量接近于世界時的一種時間計量系統,從精度上講,更加精確(自然也比GMT更精確),因此被稱世界統一時間,世界標準時間,國際協調時間。
Unix時間戳
Unix時間戳是在計算機領域才有的,每一臺電腦(服務器)在生產的時候,將GMT/UTC的1970年01月01日00時00分00秒作為起始值進行計算,得到的總秒數就是這個Unix時間戳。至于是GMT還是UTC意義并不大,因為GMT和UTC的1970年01月01日00時00分00秒是一致的,起點一致的情況下,運行的秒數也是一致的。
為什么要時間戳?因為從0開始運行的秒數永遠相等,即使出現潤秒,也并不影響時間戳。
在php中,可以通過time函數獲取時間戳:
time();
但是你應該明白,time()獲取的是,當前這臺電腦(服務器)上的Unix時間戳。兩臺電腦可能這個時間戳并不相同,有的甚至相差幾十秒。從理論上講時間戳應該是一摸一樣的,但是由于不同的電腦硬件出廠時的設定不同,也會導致GMT/UTC起始值稍有差異,甚至在計算每一秒時也有可能存在差異,這臺機器上一秒的時間比另一臺要長也是有可能的,時間久了,積累下來的時間差就會體現出來。但是,這種時間差一般不會超過幾秒鐘。
時區(Time Zone)
但是上面的time()的表述并不準確,因為我們在實踐中經常遇到time()得到的值并不是我們想要的。對應的是,date()函數得到的值,也可能出乎我們意料。
什么是時區呢?也就是以GMT/UTC為參照物的時間偏移。
以GMT為參照物的時區
在傳統的教材里,全球被劃分為24個時區,首先基于經度,其次按照國家或地區,將每一個地區劃分到某一個時區,這樣可以避免時間上的混亂。在24時區劃分之前,世界上的時間換算并沒有準確的參照,比如中國人去英國,只能問當地人現在幾點,然后撥自己的表來對。而當時區劃分之后,中國人到了英國,只需要撥慢8小時即可。在時區劃分之前,英國人跟中國人的時間可能并不是嚴格的8小時之差。
但為了照顧到同一個國家內時間的統一,大部分國家規定自己屬于同一個時區,比如中國,統一規定為東八區,這樣中國東部和西部可以采用同一個時間。畢竟沒有必要大家一定要在早上6點看到日出,沿海城市5點看,烏魯木齊9點看,并不影響大家的正常作息。
在php中,提供了大量的地區作為時區切換的標準,例如:
date_default_timezone_set('Asia/Shanghai');echo date('Y-m-d H:i:s'); // 獲得的是上海所在時區的時間
注意:PRC是中國的地區時標志,并不在Asia中,而是在Others里面找。
以UTC為參照物計算時區
但隨著UTC取代GMT成為世界標準時后,時區的計算開始使用UTC作為標準。UTC+8代表東八區,UTC-11代表西十一區。
不過隨著精度需求的提升,按大時區計算已經不能滿足需求,0.5個時區也被普遍使用,比如UTC+7.5。
在PHP中,我們可以采用這種方式來切換時區。比如:
date_default_timezone_set('UTC');echo date('Y-m-d H:i:s'); // 獲取的是0時區時間
php測試代碼:time.php
<?php//設置時區echo '<br/>默認時區時間:'.date("Y-m-d H:i:s").'<br/>';//可以在文件開頭位置設置默認配置的時區//也可以在php.ini中進行設置date.timezone(所有文件生效)ini_set('date.timezone','Asia/Shanghai');echo '<br/>上海時區時間:'.date("Y-m-d H:i:s").'<br/>';//或者直接設置時間格式date_default_timezone_set('asia/tokyo');echo '<br/>東京時區時間:'.date("Y-m-d H:i:s").'<br/>';echo '<br/>格式化時間:'.date("YmdHis").'<br/>';?>
輸出:
默認時區時間:2018-09-15 10:53:06上海時區時間:2018-09-15 16:53:06東京時區時間:2018-09-15 17:53:06格式化時間:20180915175306
摘自:https://www.tangshuang.net/2794.html