PHP應(yīng)用跨時區(qū)功能的實現(xiàn)方法
PHP中要實現(xiàn)一個跨時區(qū)的應(yīng)用,也就是不同時區(qū)登錄的用戶需要看到自己時區(qū)的時間,同時也要能夠進行時區(qū)的切換。
這里的思路是,系統(tǒng)中所有存儲的時間都是GMT(UTC)時間,用戶登錄時,根據(jù)用戶所在的時區(qū)進行對應(yīng)的顯示。
關(guān)于PHP中時間函數(shù)的使用就參考:PHP時間函數(shù)使用詳解。這里我們先了解一下PHP中時區(qū)的設(shè)置方法。PHP中進行設(shè)置的方法比較靈活多樣,可以在php.ini中設(shè)置date.timezone屬性、可以通過代碼,調(diào)用ini_set(‘date.timezone', ‘')
設(shè)置,也可以使用函數(shù) date_default_timezone_set()
,或者在htaccess文件中設(shè)置。
服務(wù)器的默認時區(qū),如果設(shè)置的和我們希望的時區(qū)不符,而且我們也沒有權(quán)限修改全局的時區(qū)配置,就只有借助于代碼了。
PHP還提供了一個方便的函數(shù),gmdate()
,可以讓我們不用關(guān)心服務(wù)器的時區(qū)設(shè)置而始終獲得GMT時間,我的思路就是基于這個函數(shù)。
我的項目中使用了Codeigniter這個框架,框架中的date這個helper提供了幾個方便的函數(shù),可以用來處理應(yīng)用中的多時區(qū)情況。
其中 now()
始終返回的是gmt的當前時間;local_to_gmt()
可以將本地的時間轉(zhuǎn)換為gmt時間;gmt_to_local()
可以將gmt時間轉(zhuǎn)換為本地時間;
考慮一個典型的應(yīng)用場景:
用戶登陸后,要顯示當前時間。這是我們可以使用now()
獲得標準的gmt時間,然后使用gmt_to_local()
函數(shù)轉(zhuǎn)化為用戶所在時區(qū)的時間。
用戶要發(fā)布一個時間。用戶發(fā)布了一個“2010-07-10 18:30:00”的時間,我們不能直接存入數(shù)據(jù)庫,必須先利用local_to_gmt()
轉(zhuǎn)化標準的gmt時間存入數(shù)據(jù)庫,這樣才能保證整個系統(tǒng)中的時間保持一致。
這兩個函數(shù)的細節(jié),其實都是根據(jù)時區(qū),然后進行相應(yīng)的運算得來。計算的時候,也可以考慮夏令時,但是所在時區(qū)夏令時的開始和結(jié)束時間,則需要自己維護。
codeigniter中提供了一份較為完整的時區(qū)列表,timezone_menu()
可以顯示一個時區(qū)的下拉列表,但是這個列表中的時間不能完全對應(yīng)到PHP自帶的時區(qū)顯示上,這是PHP本身的問題,不過可以通過下面這個函數(shù),來讓輸入的每個時區(qū),都可以獲得一個對應(yīng)的時區(qū)文字顯示。
if( ! function_exists("tz_offset_to_name") ) { /* Takes a GMT offset (in hours) and returns a timezone name */ function tz_offset_to_name($offset) { $offset *= 3600; // convert hour offset to seconds $abbrarray = timezone_abbreviations_list(); foreach ($abbrarray as $abbr) { foreach ($abbr as $city) { if ($city['offset'] == $offset) { return $city['timezone_id']; } } } return FALSE; } }
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
- 關(guān)于php程序報date()警告的處理(date_default_timezone_set)
- PHP中設(shè)置時區(qū)方法小結(jié)
- PHP跨時區(qū)(UTC時間)應(yīng)用解決方案
- PHP中遇到的時區(qū)問題解決方法
- PHP獲取中國時間(上海時區(qū)時間)及美國時間的方法
- php時區(qū)轉(zhuǎn)換轉(zhuǎn)換函數(shù)
- php輸出全球各個時區(qū)列表的方法
- 有關(guān) PHP 和 MySQL 時區(qū)的一點總結(jié)
- PHP中設(shè)置時區(qū),記錄日志文件的實現(xiàn)代碼
- PHP date_default_timezone_set()設(shè)置時區(qū)操作實例分析