我有多个在同一服务器上运行的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';"
这怎么办?
答案 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'");
}