Php Symfony+;JMS序列化程序:如何设置默认时区?

Php Symfony+;JMS序列化程序:如何设置默认时区?,php,symfony,datetime,timezone,Php,Symfony,Datetime,Timezone,我正在从事一个symfonywebapp项目,但JMS序列化程序使用的时区有问题 短版: 我如何设置在symfony项目中使用的全局默认时区,而不管该项目是在浏览器中还是在命令行中使用 (非常)长的版本: 在全局服务器中,php.ini时区设置为date.timezone=“America/Chicago” 但是,webapp应使用UTC作为默认时区 为了实现这一点,我简单地添加了ini_集(“date.timezone”,“UTC”)到app.php和app_dev.phpFrontCon

我正在从事一个symfonywebapp项目,但JMS序列化程序使用的时区有问题

短版:

我如何设置在symfony项目中使用的全局默认时区,而不管该项目是在浏览器中还是在命令行中使用

(非常)长的版本:

  • 在全局服务器中,php.ini时区设置为
    date.timezone=“America/Chicago”
  • 但是,webapp应使用
    UTC
    作为默认时区
为了实现这一点,我简单地添加了
ini_集(“date.timezone”,“UTC”)
app.php
app_dev.php
FrontController。由于对应用程序的每次访问都是通过这些文件进行的,因此此解决方案工作得非常好

然而,这个解决方案有一个大问题:只有当应用程序通过这些FrontController/在浏览器中使用时,它才起作用

当我使用控制台或任何其他命令行访问项目时,不会使用FrontController,因此不会应用时区设置

这是一个问题,例如在清除和预热缓存时:

php app/console cache:clear --env=dev
由于
php
直接在命令行上使用,因此使用全局
php.ini
。因此,将应用全局
date.timezone=“America/Chicago”

默认时区似乎存储在
appDevDebugProjectContainer.xml
缓存文件中,此外,还将为JMS序列化程序缓存时区,并将其存储在:

$ cd ...../app/cache/dev
$ grep -rnw .'/' -e "America/Chicago"
./appDevDebugProjectContainer.xml:4125:      <argument>America/Chicago</argument>
./appDevDebugProjectContainer.php:3083:        return $this->services['jms_serializer.datetime_handler'] = new \JMS\Serializer\Handler\DateHandler('Y-m-d\\TH:i:sO', 'America/Chicago', true);
此解决方案可行,但我不喜欢:

  • 我必须维护两个php.ini文件。全局php.ini和项目php.ini。由于INI未合并(从iniA中选择一个选项,从iniB中选择所有其他选项),因此这是可能的,但很麻烦
  • 我仍然无法100%确定是否有任何内部php调用可能无法通过FrontController路由,从而可能使用错误的时区:
结论:

是否有任何选项可以全局设置整个Symfony项目的默认时区?到目前为止,我只找到了一个Symfony 2.x的解决方案,但没有找到等效的解决方案


有什么想法吗?

嗯,有时候答案很明显,人们看不见。至少在这里写一个长问题之前…:-)

在我发送问题后,我马上找到了答案:默认时区应该在Symfony的所有地方应用,无论它是如何使用的(浏览器、控制台等)?那么,Symfony的哪一部分在任何时候、任何地方都在使用内核

我只是简单地修改了AppKernel,它工作得很好:

class AppKernel extends Kernel
{   
    public function __construct($environment, $debug)
    {
        // Two is better than one...
        ini_set("date.timezone", "UTC");
        date_default_timezone_set('UTC');

        parent::__construct($environment, $debug);
    }
}

嗯,有时候答案是如此明显,以至于人们看不到它。至少在这里写一个长问题之前…:-)

在我发送问题后,我马上找到了答案:默认时区应该在Symfony的所有地方应用,无论它是如何使用的(浏览器、控制台等)?那么,Symfony的哪一部分在任何时候、任何地方都在使用内核

我只是简单地修改了AppKernel,它工作得很好:

class AppKernel extends Kernel
{   
    public function __construct($environment, $debug)
    {
        // Two is better than one...
        ini_set("date.timezone", "UTC");
        date_default_timezone_set('UTC');

        parent::__construct($environment, $debug);
    }
}