天天看點

PHP中關于時間(戳)、時區、本地時間、UTC時間等的梳理PHP中關于時間(戳)、時區、本地時間、UTC時間等的梳理

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