2014-09-03 26 views
0

我試圖顯示我們的客戶的各個時區和它們從中派生出來的當地時間的列表。現在在我的客戶端模型中,我有以下函數(doAfterFind),它只是afterFind的一個包裝,它提供了一致的格式。Paginator排序在afterFind字段

public function doAfterFind($result = array()) { 
    $result = parent::doAfterFind($result); 

    if (!empty($result['timezone'])) { 
     App::uses('CakeTime', 'Utility'); 

     $result['local_time'] = CakeTime::format(
      VIEW_DATE_FORMAT, 
      strtotime('now'), 
      null, 
      $result['timezone'] 
     ); 
    } 

    return $result; 
} 

local_time字段被正確放置在模型的查找()之後。我試圖將其作爲虛擬領域來實現,因爲它需要進行排序。問題是我無法弄清楚如何根據當前時間和客戶端的時區來計算時間。我已經在模型的構造函數中嘗試了相同的操作並將其添加到virtualFields數組中,但時區在構造函數調用期間不可用 - 因爲沒有加載標識或任何內容。

有沒有人知道一種方法來讓MySQL計算這個,或者使用我已經有的東西,但是作爲一個與Paginator sort()兼容的虛擬字段?我可以在視圖中格式化日期顯示,但需要本地時間列可排序。

說明: 我的時區存儲爲區域設置名稱(America/New_York等)。 常量VIEW_DATE_FORMAT只是日期()格式字符串F jS, Y - g:i A

+0

在虛擬字段中嘗試此功能http://dev.mysql.com/doc/refman/5.5/zh-CN/date-and-time-functions.html#function_convert-tz。 – burzum 2014-09-03 16:10:30

回答

0

假設你有你的工作在服務器shell訪問,看到這對於設置你的mysql服務器能夠根據時區的名字做時區轉換:http://blog.mozilla.org/it/2012/11/16/converting-timezone-specific-times-in-mysql/

一旦你建立了,你應該能夠使虛擬領域:

$this->virtualFields['local_time'] = "CONVERT_TZ(NOW(), 'UTC', Client.timezone)"; 

(如果您的服務器沒有設置爲UTC,你就必須替換爲您的服務器的時區的第二個參數)

,結果將可能不是形式按照你想要的方式,但你可以在afterFind中進行格式化。

+0

由於目前在共享主機上,因此沒有shell訪問權限,但至少我現在處於正確的軌道。謝謝凱!一旦我以某種方式加載時區表,這將工作得很好。 – 2014-09-03 17:03:02