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() 轉換成無擱置模式。