Symfony主义-设置时区

时间:2019-01-11 17:49:46

标签: symfony doctrine

我有多个在同一服务器上运行的Symfony应用程序,每个应用程序可能需要不同的时区。

对于php,可以通过使用不同的fpm池并在池配置中设置时区来实现:

php_admin_value[date.timezone] = America/New_York

但是对于MySQL,我需要发出以下语句:

"SET time_zone = 'America/New_York';

作为连接后的第一个查询,或添加到PDO构造函数中的$ options数组:

PDO::MYSQL_ATTR_INIT_COMMAND => "SET time_zone = 'America/New_York';"

这怎么办?

2 个答案:

答案 0 :(得分:2)

您可以使用PostConnect主义事件... https://www.doctrine-project.org/projects/doctrine-dbal/en/2.9/reference/events.html#postconnect-event

这对于在执行任何sql语句之前配置连接很有用。

一个例子可能是...

<?php

namespace App\EventListener;

use Doctrine\DBAL\Event\ConnectionEventArgs;

/**
 * My initializer
 */
class  MyPdoInitializerListener
{
    public function postConnect(ConnectionEventArgs $args)
    {
        $args->getConnection()
            ->exec("SET time_zone = 'America/New_York'");
    }
}

不要忘记将侦听器添加到services.yaml

# services.yaml

    # ...

    App\EventListener\MyPdoInitializerListener:
        tags:
            - { name: doctrine.event_listener, event: postConnect }

答案 1 :(得分:0)

要扩展到SilvioQ's answer,我编写了以下代码段以继承PHP环境的时区,假设先前曾调用date_default_timezone_set()来设置正确的时区:

当命名时区为not available within MySQL/MariaDB并且您无法控制服务器时,此解决方案比命名时区(如"America/New_York")具有优势。

public function postConnect(ConnectionEventArgs $args) {
    $tz = new DateTimeZone(date_default_timezone_get());
    $offset = $tz->getOffset(new DateTime('now'));
    $abs = abs($offset);
    $str = sprintf('%s%02d:%02d', $offset < 0 ? '-' : '+', intdiv($abs, 3600), intdiv($abs % 3600, 60));
    $args->getConnection()->exec("SET time_zone = '$str'");
}