2014-09-03 60 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