PHP應(yīng)用跨時(shí)區(qū)功能的實(shí)現(xiàn)方法
PHP中要實(shí)現(xiàn)一個(gè)跨時(shí)區(qū)的應(yīng)用,也就是不同時(shí)區(qū)登錄的用戶需要看到自己時(shí)區(qū)的時(shí)間,同時(shí)也要能夠進(jìn)行時(shí)區(qū)的切換。
這里的思路是,系統(tǒng)中所有存儲(chǔ)的時(shí)間都是GMT(UTC)時(shí)間,用戶登錄時(shí),根據(jù)用戶所在的時(shí)區(qū)進(jìn)行對應(yīng)的顯示。
關(guān)于PHP中時(shí)間函數(shù)的使用就參考:PHP時(shí)間函數(shù)使用詳解。這里我們先了解一下PHP中時(shí)區(qū)的設(shè)置方法。PHP中進(jìn)行設(shè)置的方法比較靈活多樣,可以在php.ini中設(shè)置date.timezone屬性、可以通過代碼,調(diào)用ini_set(‘date.timezone', ‘')設(shè)置,也可以使用函數(shù) date_default_timezone_set(),或者在htaccess文件中設(shè)置。
服務(wù)器的默認(rèn)時(shí)區(qū),如果設(shè)置的和我們希望的時(shí)區(qū)不符,而且我們也沒有權(quán)限修改全局的時(shí)區(qū)配置,就只有借助于代碼了。
PHP還提供了一個(gè)方便的函數(shù),gmdate(),可以讓我們不用關(guān)心服務(wù)器的時(shí)區(qū)設(shè)置而始終獲得GMT時(shí)間,我的思路就是基于這個(gè)函數(shù)。
我的項(xiàng)目中使用了Codeigniter這個(gè)框架,框架中的date這個(gè)helper提供了幾個(gè)方便的函數(shù),可以用來處理應(yīng)用中的多時(shí)區(qū)情況。
其中 now() 始終返回的是gmt的當(dāng)前時(shí)間;local_to_gmt() 可以將本地的時(shí)間轉(zhuǎn)換為gmt時(shí)間;gmt_to_local() 可以將gmt時(shí)間轉(zhuǎn)換為本地時(shí)間;
考慮一個(gè)典型的應(yīng)用場景:
用戶登陸后,要顯示當(dāng)前時(shí)間。這是我們可以使用now()獲得標(biāo)準(zhǔn)的gmt時(shí)間,然后使用gmt_to_local()函數(shù)轉(zhuǎn)化為用戶所在時(shí)區(qū)的時(shí)間。
用戶要發(fā)布一個(gè)時(shí)間。用戶發(fā)布了一個(gè)“2010-07-10 18:30:00”的時(shí)間,我們不能直接存入數(shù)據(jù)庫,必須先利用local_to_gmt() 轉(zhuǎn)化標(biāo)準(zhǔn)的gmt時(shí)間存入數(shù)據(jù)庫,這樣才能保證整個(gè)系統(tǒng)中的時(shí)間保持一致。
這兩個(gè)函數(shù)的細(xì)節(jié),其實(shí)都是根據(jù)時(shí)區(qū),然后進(jìn)行相應(yīng)的運(yùn)算得來。計(jì)算的時(shí)候,也可以考慮夏令時(shí),但是所在時(shí)區(qū)夏令時(shí)的開始和結(jié)束時(shí)間,則需要自己維護(hù)。
codeigniter中提供了一份較為完整的時(shí)區(qū)列表,timezone_menu() 可以顯示一個(gè)時(shí)區(qū)的下拉列表,但是這個(gè)列表中的時(shí)間不能完全對應(yīng)到PHP自帶的時(shí)區(qū)顯示上,這是PHP本身的問題,不過可以通過下面這個(gè)函數(shù),來讓輸入的每個(gè)時(shí)區(qū),都可以獲得一個(gè)對應(yīng)的時(shí)區(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í)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
- 關(guān)于php程序報(bào)date()警告的處理(date_default_timezone_set)
- PHP中設(shè)置時(shí)區(qū)方法小結(jié)
- PHP跨時(shí)區(qū)(UTC時(shí)間)應(yīng)用解決方案
- PHP中遇到的時(shí)區(qū)問題解決方法
- PHP獲取中國時(shí)間(上海時(shí)區(qū)時(shí)間)及美國時(shí)間的方法
- php時(shí)區(qū)轉(zhuǎn)換轉(zhuǎn)換函數(shù)
- php輸出全球各個(gè)時(shí)區(qū)列表的方法
- 有關(guān) PHP 和 MySQL 時(shí)區(qū)的一點(diǎn)總結(jié)
- PHP中設(shè)置時(shí)區(qū),記錄日志文件的實(shí)現(xiàn)代碼
- PHP date_default_timezone_set()設(shè)置時(shí)區(qū)操作實(shí)例分析
相關(guān)文章
PHP array_flip() 刪除重復(fù)數(shù)組元素專用函數(shù)
array_flip() 返回一個(gè)反轉(zhuǎn)后的 array,例如 trans 中的鍵名變成了值,而 trans 中的值成了鍵名。2010-05-05
修改Zend引擎實(shí)現(xiàn)PHP源碼加密的原理及實(shí)踐
來源:phphot PHP文件的源碼都是明文,這對于某些商業(yè)用途來說,并不適合。 因此考慮使用加密的手段保護(hù)源碼。 實(shí)在不耐煩等待zend出編譯器,而且編譯和加密本質(zhì)上不是一回事兒。自己動(dòng)手、開始修改。2008-04-04
php實(shí)現(xiàn)的Cookies操作類實(shí)例
這篇文章主要介紹了php實(shí)現(xiàn)的Cookies操作類及其用法實(shí)例,包括了常見了保存、讀取、更新及清除cookie等操作,在需要進(jìn)行cookie操作時(shí)非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-09-09
簡單說說PHP優(yōu)化那些事(經(jīng)驗(yàn)分享)
下面我想講講我對PHP優(yōu)化的理解。優(yōu)化的目的是花最少的代價(jià)換來最快的運(yùn)行速度與最容易維護(hù)的代碼2014-11-11

