網頁

2015年2月18日 星期三

取得使用者目前的時區

最近一個網站的對象是整個美國,加上有每日記錄的問題,發生了使用者在同一個做記錄,卻沒多久就變隔一天的窘境,查了半天看起來strtotime預設用的是UTC,除非特別寫進去要parser的字串中或設定php.ini,但重點在我不能固定在一個時區,歸納了有底下幾個需求
  1. 要取得使用者目前所在的時區
  2. 要能使用者各自有各自的時區
  3. 使用者之間不能互相影響
PHP 5.3.x 的 strtotime() 時區設定 警告訊息修正這篇可以知道,改時區大概有兩種種方式(其實不只)
  1. php.ini中設定date.timezone
  2. Function: date_default_timezone_set
這邊合乎需求的是date_default_timezone_set。試用過後,發現只有在設定後才會有效果。http呼叫重新來過時,又是用系統設定,不會互相影響。

再來要取得目前使用者時區,看了不少方式,都是取得目前系統時間再做差異比較,不過這方式很多細節要處理,最後找到這個jsTimezoneDetect,很容易使用,程式碼如下:

var timezone = jstz.determine();
function get_user_timezone(target)
{
    if( target != null && target.length != 0 )
        target.val(encodeURI(timezone.name()));
    return timezone.name();
}

要注意的是,不能在function中使用,宣告的變數要在最外頭,也不能放在jQuery.ready裡頭,jstz才可以存取到。

這樣就可以利用get_user_timezone取得時區名稱,如:Asia/Taipei。jstz會幫忙做轉換,也會計算日光節約時間等,省掉不少麻煩。

相關函式庫:
jsTimezoneDetect
tamaspap/timezones
jquery.detect_timezone


參考網址:
How to get client's timezone?
Get user's timezone using javascript/jQuery and PHP
PHP5 time zone solution
Auto-detecting user's timezone
List of Supported Timezones
Getting the Time Zone from a Web Browser
Detect user timezone using javascript
How to initialize javascript date to a particular timezone
Generating a drop down list of timezones with PHP

IANA - Time Zone Database

Date/Time based on user's location

查詢時間、請輸入國家、地區或主要城市的中文或英文名稱
Time Zones

沒有留言:

張貼留言