Symfony原则-设定时区

Symfony原则-设定时区,symfony,doctrine,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 =>

我有多个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';"

如何做到这一点?

您可以使用后连接原则事件

这有助于在执行任何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'");
    }
}
为了进一步扩展,我编写了以下代码段以从PHP环境继承时区,假设以前调用了
date\u default\u timezone\u set()
,以设置正确的时区:

此解决方案比指定时区(如
“America/New_York”
)更具优势,因为这些指定时区都是指定时区,而您无法控制服务器

公共功能后连接(ConnectionEventArgs$args){
$tz=新的日期时区(日期\默认\时区\获取());
$offset=$tz->getOffset(新日期时间('now'));
$abs=abs($offset);
$str=sprintf(“%s%02d:%02d',$offset<0?'-':“+”,intdiv($abs,3600),intdiv($abs%3600,60));
$args->getConnection()->exec(“设置时区=“$str”);
}

不要走这条路。在UTC everywhere中以应用程序格式运行,日期改为使用适当的时区。这种方法更简单、更干净。在Twig bundle配置中,您甚至可以设置时区,以便Twig为您进行转换。我自己没有尝试过,但Doctrine dbal options配置应该允许您设置时区。但我同意使用utc是更好的方法。另一种方法是高优先级内核请求侦听器,它将在其他任何事情发生之前执行设置的时区语句。@emix我的数据按日期聚合,我不存储时间,但如果现在发生了什么事,我将其存储在日期为2019-01-13的列中。因此,日期可能会根据时区的不同而变化。我想最好的方法是在应用程序级别计算日期,并将MySQL留给utc,或者仅在没有其他方法的情况下进行设置。谢谢您的回答。我有一个类似的问题,symfony/doctor/php的时区与mysql不同,我不知道在数据库上设置时区会产生什么副作用,所以我计算了mysql中php Datetime和now函数之间的偏移量,并将其设置为偏移量。
# services.yaml

    # ...

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