【问题标题】:How do I set a MysQL variable (time_zone) from within doctrine / symfony?如何从教义/symfony 中设置 Mysql 变量(time_zone)?
【发布时间】:2011-04-15 00:56:29
【问题描述】:

我想知道如何在 Symfony/Doctrine 中将 MySQL 时区设置为 UTC (SET time_zone = 'UTC'),所以当我在查询中的 DATETIME 字段上调用 ​​UNIX_TIMESTAMP() 函数时,它会返回UTC unix 时间,而不是服务器时区的 unix 时间。

如何在每次连接时自动执行此操作,或者在时区有所不同的这些类型的查询之前手动执行此操作?

顺便说一句,我需要在 MySQL 查询而不是应用程序中进行此转换,因此我可以 GROUP BY 一个需要纪元时间的间隔。

【问题讨论】:

    标签: php mysql symfony1 doctrine symfony-1.4


    【解决方案1】:

    您可以通过在 ProjectConfiguration 中调用的 configureDoctrineConnection 回调来执行此操作:

    public function configureDoctrineConnection(Doctrine_Connection $connection)
    {
      $connection->exec('SET time_zone = "UTC"');
    }
    

    如果您使用多个连接,这可能会出现问题。

    (已编辑答案以删除有缺陷的附加方法。)

    【讨论】:

    • 第一个给出错误“...中没有打开的连接”,但第二个效果很好,谢谢。注意:我猜“UTC”至少在我的机器上不是一个有效的时区,所以我把它改成了“+0:00”。
    【解决方案2】:

    我会尝试编辑 projectConfiguration,并添加类似(未经测试和未经验证)的内容:

        $databaseManager = new sfDatabaseManager($this->configuration);
        $connection = $databaseManager->getDatabase($options['connection'])->getConnection();
        $diff = $connection->execute("SET time_zone = 'UTC'");
    

    注意,$options$this->configuration 仅在任务中可用,所以也许这应该是硬编码的(我相信默认是 'doctrine')。

    【讨论】:

    • 无法开箱即用,我对 Symfony 的了解也不够,无法很好地解决它($this->在这种情况下配置为空..)
    • 此处提供的解决方案不必开箱即用;我只是为您指出了寻找答案的正确方向(在这种情况下是杰里米的)。
    • 我并不是要暗示他们这样做了,只是我没有花太多时间对其进行故障排除(因为有另一个立即起作用的答案)。谢谢。
    【解决方案3】:

    如果您想在 Symfony 应用程序级别执行此操作,方法是将其添加到 config/settings.yml

    all:
      .settings:
        default_culture: en_US
        default_timezone: Asia/Kolkata
    

    【讨论】:

    • 能否也添加文档链接?
    【解决方案4】:

    很抱歉不是在 MySQL 上,而是在 Oracle DB 上。 我在Oracle DB上搜索了很长时间的数据,但一无所获。 这是唯一也讨论该问题的主题,但仅限于 MySQL。

    也许有人会为 Oracle DB 提供帮助:

    在文件config/services.yaml

    对于 Symofony 4:

    services:
        Doctrine\DBAL\Event\Listeners\OracleSessionInit:
            arguments:
                - TIME_ZONE: 'UTC'
            tags:
                - { name: doctrine.event_listener, event: postConnect }
    

    对于 Symfony 2 和 3:

    services:
        oci8.listener:
            class: Doctrine\DBAL\Event\Listeners\OracleSessionInit
            arguments:
                - TIME_ZONE: 'UTC'
            tags:
                - { name: doctrine.event_listener, event: postConnect }
    

    或者,您可以将参数对象写入 yaml 为:

    arguments: { TIME_ZONE: 'UTC' }
    

    【讨论】:

      【解决方案5】:

      对于 MySQL 8 和 Symfony 5,您可以将以下内容添加到 config/services.yaml

      services:
          Doctrine\DBAL\Event\Listeners\SQLSessionInit:
              arguments:
                  - 'SET TIME_ZONE="+04:00"'
              tags:
                  - { name: doctrine.event_listener, event: postConnect }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多