現在有乙個跨時區的應用,不同時區登入的使用者需要看到自己時區的時間,同時也要能夠進行時區的切換,有什麼好辦法麼。
我的思路是,系統中所有儲存的時間都是gmt(utc)時間,使用者登入時,根據使用者所在的時區進行對應的顯示。
首先了解一下php中時區的設定方法。php中進行設定的方法比較靈活多樣,可以在php.ini中設定date.timezone屬性、可以通過**,呼叫ini_set(『date.timezone』, 『』)設定,也可以使用函式 date_default_timezone_set(),或者在htaccess檔案中設定。
伺服器的預設時區,如果設定的和我們希望的時區不符,而且我們也沒有許可權修改全域性的時區配置,就只有借助於**了。
php還提供了乙個方便的函式,gmdate(),可以讓我們不用關心伺服器的時區設定而始終獲得gmt時間,我的思路就是基於這個函式。
我的專案中使用了codeigniter這個框架,框架中的date這個helper提供了幾個方便的函式,可以用來處理應用中的多時區情況。
其中 now() 始終返回的是gmt的當前時間;
local_to_gmt() 可以將本地的時間轉換為gmt時間;
gmt_to_local() 可以將gmt時間轉換為本地時間;
考慮乙個典型的應用場景:
使用者登陸後,要顯示當前時間。這是我們可以使用now()獲得標準的gmt時間,然後使用gmt_to_local()函式轉化為使用者所在時區的時間。
使用者要發布乙個時間。使用者發布了乙個「2010-07-10 18:30:00」的時間,我們不能直接存入資料庫,必須先利用local_to_gmt() 轉化標準的gmt時間存入資料庫,這樣才能保證整個系統中的時間保持一致。
這兩個函式的細節,其實都是根據時區,然後進行相應的運算得來。計算的時候,也可以考慮夏令時,但是所在時區夏令時的開始和結束時間,則需要自己維護。
codeigniter中提供了乙份較為完整的時區列表,timezone_menu() 可以顯示乙個時區的下拉列表,但是這個列表中的時間不能完全對應到php自帶的時區顯示上,這是php本身的問題,不過可以通過下面這個函式,來讓輸入的每個時區,都可以獲得乙個對應的時區文字顯示。
if( ! function_exists("tz_offset_to_name") ) }} return false; } }
PHP中跨時區應用的解決方法
現在有乙個跨時區的應用,不同時區登入的使用者需要看到自己時區的時間,同時也要能夠進行時區的切換,有什麼好辦法麼。我的思路是,系統中所有儲存的時間都是gmt utc 時間,使用者登入時,根據使用者所在的時區進行對應的顯示。首先了解一下php中時區的設定方法。php中進行設定的方法比較靈活多樣,可以在p...
PHP實現跨域解決方法
例如 客戶端的網域名稱是client.runoob.com,而請求的網域名稱是server.runoob.com。如果直接使用ajax訪問,會有以下錯誤 xmlhttprequest cannot load no access control allow origin header is prese...
PHP實現跨域的解決方法
php實現跨域解決方法 如果要實現跨域通過設定access control allow origin來實現跨域。例如 客戶端的網域名稱是client.runoob.com,而請求的網域名稱是server.runoob.com。如果直接使用ajax訪問,會有以下錯誤 1 允許單個網域名稱訪問 指定某網...