1. 程式人生 > >php獲取時間(系統時間和網路時間)

php獲取時間(系統時間和網路時間)

用php的時候可能經常會用到標準時間,有兩個辦法。

第一種方法

獲取伺服器的時間

首先配置php.ini中的date.timezone = PRC或者直接在程式頁面加入date_default_timezone_set("PRC"); 然後就可以使用time()date(''Y-m-d H:i:s)

有一種情形是這樣子的,比如機票業務中的訂票流程,我們需要一個非常可靠的當前時間來支援,儘管大多數伺服器的時間是非常準確的,我們使用time()來獲取的時間是可靠的,但未免會有不確切的情況,也有的伺服器由於未開啟ntp(Network Time Protocol ) 來進行時間同步,再由於硬體環境等因素,導致時間五花八門,這在通常,也就差個幾分鐘、最多幾個小時的情況是無可厚非的,因為在同一個網站使用的是同一個 時間,可是有的時候這樣很糟糕。在internet上,有免費專門提供UTC時間校正的授時伺服器,使用NTP協議,這個可以參考前面的連結來獲取更多知 識。他提供的時間誤差在20ms左右(不要說在資料傳輸過程中會耗費的時間不等,NTP早就考慮到了這一點),因此通過這種授時伺服器,我們就能得非常可 信的當前時間。

我們現在就來看看用PHP怎麼獲取到非常精準的UTC時間,由於NTP協議稍微有一點點的不好用,我們有一個更好的協議可以用,他就是Daytime Protocol協議,通過這個協議我們可以直接得到文字資料,這樣處理起來會更加方便。我們使用time.nist.gov的時間服務,程式碼非常簡單, 用TCP連線它的13埠就可以了。

$fp=fsockopen('time.nist.gov',13,$errno,$errstr,90);  
echo fread($fp,2010);  

獲得到的資料類似於這樣的:

55545 10-12-15 21:40:47 00 0 0 113.1 UTC(NIST) *  

這個串的每個部分都有意義,具體的請參看:http://www.nist.gov/pml/div688/grp40/its.cfm ,現在我們只關心中間的部分和206.9前面的那個0,它表示伺服器的健康狀況,也反映當前的時間是否可信。

OK了,用PHP實現獲得準確的UTC時間,這個應用在對時間要求非常苛刻的場合還是很有價值的,到此,我的問題也算解決了。

知道了UTC 標準時間, 剩下的就是轉換成世界時間了,參看 php獲取當地時間 time zone


$fp=fsockopen('time.nist.gov',13,$errno,$errstr,90);  
$ufc = explode(' ',fread($fp
,date('Y'))); $date = explode('-',$ufc[1]); $processdate = $date[1].'-'.$date[2].'-'. date('Y').' '.$ufc[2]; switch($ufc[5]) { case 0: echo '精確'; break; case 1: echo '誤差:0-5s'; break; case 2: echo '誤差: > 5s'; break; default: echo '硬體出錯!'; break; } echo gmttolocal($processdate,8); // 中國 function gmttolocal($mydate,$mydifference) { $datetime = explode(" ",$mydate); $dateexplode = explode("-",$datetime[0]); $timeexplode = explode(":",$datetime[1]); $unixdatetime = mktime($timeexplode[0]+$mydifference,$timeexplode[1],0,$dateexplode[0],$dateexplode[1],$dateexplode[2]); return date("m/d/Y H:i:s",$unixdatetime); }

fsockopen 解釋:

開啟網路的 Socket 連結。
語法: int fsockopen(string hostname, int port, int [errno], string [errstr], int [timeout]);
返回值: 整數
函式種類: 網路系統

內容說明目前這個函式提供二個 Socket 資料流介面,分別為 Internet 用的 AF_INET 及 Unix 用的 AF_UNIX。當在 Internet 情形下使用時,引數 hostname 及 port 分別代表網址及埠號。在 UNIX 情形可做 IPC,hostname 引數表示到 socket 的路徑,port 配置為 0。可省略的 timeout 選項表示多久沒有連上就中斷。在使用本函式之後會返回檔案指標,供檔案函式使用,包括 fgets()、fgetss()、fputs()、fclose() 與 feof()。引數 errno 及 errstr 也是可省略的,主要當做錯誤處理使用。使用本函式,會使用擱置模式 (blocking mode) 處理,可用 set_socket_blocking() 轉換成無擱置模式。