0

我正在尝试显示我们客户的各个时区及其本地时间的列表。现在在我的客户端模型中,我有以下函数(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

4

1 回答 1

0

假设您对正在使用的服务器具有 shell 访问权限,请参阅有关设置您的 mysql 服务器以能够根据时区名称进行时区转换:http: //blog.mozilla.org/it/2012/11/ 16/转换-timezone-specific-times-in-mysql/

设置完成后,您应该能够创建一个虚拟字段:

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

(如果您的服务器未设置为 UTC,则必须将第二个参数替换为服务器的时区。)

结果可能不会按照您想要的方式进行格式化,但您可以在afterFind.

于 2014-09-03T16:22:42.567 回答