我试图显示我们客户的各个时区列表以及从中获取的当地时间。现在在我的客户端模型中,我有以下函数(doAfterFind),它只是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
字段在find()之后正确放置在模型中。我试图将其实现为虚拟字段,因为它需要进行排序。问题是我无法根据当前时间和客户的时区计算出如何计算时间。我在模型的构造函数中尝试了相同的操作并将其添加到virtualFields数组中,但在构造函数调用期间时区不可用 - 因为没有加载ID或任何内容。
有没有人知道让MySQL计算这个的方法,或者使用我已经拥有的东西但是作为与Paginator sort()兼容的虚拟字段?我可以在视图中格式化日期显示,但需要本地时间列可以排序。
注意:
我的时区存储为区域设置名称(America / New_York等)。
常量VIEW_DATE_FORMAT只是date()格式字符串F jS, Y - g:i A
。
答案 0 :(得分: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
中进行格式化。