用php的時候可能常會用到標準時間,有兩個辦法。
第一種方法:
取得伺服器的時間
先設定php.ini中的date.timezone = PRC
或直接在程式頁面加入date_default_timezone_set("PRC"); ()
或date(''Y-m-d H:i:s)
第二種方法:取得網路時間(這裡是藉網上的,原文網址:http://justcoding.iteye.com/blog/843645 )
有一種情形是這樣子的,例如機票業務中的訂票流程,我們需要一個非常可靠的當前時間來支持,儘管大多數伺服器的時間是非常準確的,我們使用time()來獲取的時間是可靠的,但未免會有不確切的情況,也有的伺服器由於未開啟ntp(Network Time Protocol ) 來進行時間同步,再由於硬體環境等因素,導致時間五花八門,這在通常,也就差個幾分鐘、最多幾個小時的情況是無可厚非的,因為在同一個網站使用的是同一時間,可是有的時候這樣很糟糕。在internet上,有免費專門提供UTC時間校正的授時伺服器,使用NTP協議,這個可以參考前面的連結來獲取更多知識。他提供的時間誤差在20ms左右(不要說在資料傳輸過程中會耗費的時間不等,NTP早就考慮到了這一點),因此透過這種授時伺服器,我們就能得非常可 信的當前時間。
我們現在就來看看用PHP怎麼獲取到非常精準的UTC時間,由於NTP協議稍微有一點點的不好用,我們有一個更好的協議可以用,他就是Daytime Protocol協議,通過這個協議我們可以直接得到文字數據,這樣處理起來會更方便。我們使用time.nist.gov的時間服務,程式碼非常簡單, 用TCP連接它的13埠就可以了。
<code><span>$fp</span>=fsockopen(<span>'time.nist.gov'</span>,<span>13</span>,<span>$errno</span>,<span>$errstr</span>,<span>90</span>); <span>echo</span> fread(<span>$fp</span>,<span>2010</span>); </code>
所獲得的資料類似於這樣的:
<code>55545 10<span>-12-15</span> 21<span>:40</span><span>:47</span> 00 0 0 113<span>.1</span><span>UTC</span>(<span>NIST</span>) * </code>
這個串的每個部分都有意義,具體的請參看:http://www.nist.gov/pml/div688/grp40/its.cfm ,現在我們只關心中間的部分和206.9前面的那個0,它表示伺服器的健康狀況,也反映當前的時間是否可信。
OK了,用PHP實現獲得準確的UTC時間,這個應用在對時間要求非常苛刻的場合還是很有價值的,到此,我的問題也算解決了。
知道了UTC 標準時間, 剩下的就是轉換成世界時間了,請參閱 php取得當地時間 time zone
<code><span>$fp</span>=fsockopen(<span>'time.nist.gov'</span>,<span>13</span>,<span>$errno</span>,<span>$errstr</span>,<span>90</span>); <span>$ufc</span> = explode(<span>' '</span>,fread(<span>$fp</span>,date(<span>'Y'</span>))); <span>$date</span> = explode(<span>'-'</span>,<span>$ufc</span>[<span>1</span>]); <span>$processdate</span> = <span>$date</span>[<span>1</span>].<span>'-'</span>.<span>$date</span>[<span>2</span>].<span>'-'</span>. date(<span>'Y'</span>).<span>' '</span>.<span>$ufc</span>[<span>2</span>]; <span>switch</span>(<span>$ufc</span>[<span>5</span>]) { <span>case</span><span>0</span>: <span>echo</span><span>'精确'</span>; <span>break</span>; <span>case</span><span>1</span>: <span>echo</span><span>'误差:0-5s'</span>; <span>break</span>; <span>case</span><span>2</span>: <span>echo</span><span>'误差: > 5s'</span>; <span>break</span>; <span>default</span>: <span>echo</span><span>'硬件出错!'</span>; <span>break</span>; } <span>echo</span> gmttolocal(<span>$processdate</span>,<span>8</span>); <span>// 中国 </span><span><span>function</span><span>gmttolocal</span><span>(<span>$mydate</span>,<span>$mydifference</span>)</span>{</span><span>$datetime</span> = explode(<span>" "</span>,<span>$mydate</span>); <span>$dateexplode</span> = explode(<span>"-"</span>,<span>$datetime</span>[<span>0</span>]); <span>$timeexplode</span> = explode(<span>":"</span>,<span>$datetime</span>[<span>1</span>]); <span>$unixdatetime</span> = mktime(<span>$timeexplode</span>[<span>0</span>]+<span>$mydifference</span>,<span>$timeexplode</span>[<span>1</span>],<span>0</span>,<span>$dateexplode</span>[<span>0</span>],<span>$dateexplode</span>[<span>1</span>],<span>$dateexplode</span>[<span>2</span>]); <span>return</span> date(<span>"m/d/Y H:i:s"</span>,<span>$unixdatetime</span>); } </code>
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 情形可做
,hostname 參數表示到 socket 的路徑,port 配置為 0。可省略的 timeout 選項表示多久沒有連上就中斷。使用本函數之後會傳回檔案指針,供檔案函數使用,包括 fgets()、fgetss()、fputs()、fclose() 與 feof()。參數 errno 及 errstr 也是可省略的,主要當做錯誤處理使用。使用本函數,會使用擱置模式 (blocking mode) 處理,可用 set_socket_blocking() 轉換成無擱置模式。 Author:
leedaning
本文網址:http://blog.csdn.net/leedaning/article/details/48547123
以上就介紹了php取得時間(系統時間和網路時間),包括了方面的內容,希望對PHP教學有興趣的朋友有幫助。