2012-01-03 28 views
1

我試圖獲得使用Zend框架的第一個請求用戶的時區。 目前,一旦我獲得時區,我將它存儲到一個$_SESSION變量。如何得到他們的第一個請求用戶時區(最佳實踐)

這裏是我的動作控制器:

public function init() 
{ 
    $ajaxContext = $this->_helper->getHelper('AjaxContext'); 
    $ajaxContext->addActionContext('timezone', 'html')->initContext();  
} 

public function timezoneAction() 
{ 
    $_SESSION['tz'] = $this->_getParam('tzName'); 
} 

我知道,其實有沒有辦法通過JavaScript的,因爲阿賈克斯的第一個請求期間訪問該會話變量是一個客戶端腳本和檢測發生在第一次請求之後。也無法通過HTTP標頭獲取用戶的時區。

那麼,如何獲得用戶的時區第一次請求? geo-ip是唯一可用的解決方案嗎?什麼是最佳實踐?謝謝。

回答

3

如果我讀你的權利,問題是:

  • 一些(新)用戶加載頁面。
  • 您希望用戶看到的東西,反映了他們的時區(可能轉化爲他們的時區的一些UTC時間。
  • 在此期間,第一個請求,服務器不知道他們的時區是什麼。
  • WAT DO?

最直接的解決辦法是做所有客戶端(除非我失去了一些要求 - 你的問題是不是你的背景完全清楚)。有在UTC服務器輸出的東西,包裹在某些HTML元素與一個特殊的類(即:<span class="datetime">2012-01-2 01:02:03 UTC</span>,然後有一些JavaScript替換這些元素的內容與一些更人性化,本地化,表示當地時間。

當然,JS沒有真正給你的時區。它只是給你一個偏移量(通過使用getTimezoneOffset()),但應該是足夠用於顯示目的,除非我忘了什麼東西(這是有點可能,因爲我有在一個點上找到這個令人沮喪的模糊的記憶,但我認爲這是因爲我想要一個實際的時區而不是偏移量,因爲夏時制)。

+0

這真的取決於你。你實際上可以做到這兩點。如果服務器設置了時區,則可以輸出本地時間並跳過javascript(或者不輸出調用它的調用,或者跳過'class =「datetime」位)。 – timdev 2012-01-03 19:17:39

0

發送時間在一個AJAX請求到服務器並將其與您的服務器的時間。計算差異,然後使用它來確定用戶的時區。

你也可以使用地理-IP來幫助你找出其中你的用戶在無法登錄。