2014-09-03 1 views
0

Я пытаюсь показать список различных часовых поясов нашего клиента и их локальное время, которое происходит от этого. Прямо сейчас в моей модели клиента у меня есть следующая функция (doAfterFind), которая представляет собой всего лишь оболочку afterFind, которая дает согласованный формат.Paginator sort on afterFind field

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/en/date-and-time-functions.html#function_convert-tz в виртуальном поле. – burzum

ответ

0

Если у вас есть доступ к оболочке сервера вы работаете, смотрите это Что касается настройки вашего сервера 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

У меня нет доступа к оболочке, так как он находится на общем хосте, но по крайней мере я сейчас на правильном пути. Спасибо, Кай! Это будет отлично работать, как только я получу таблицы времени, загруженные как-то. –