我正在开发一个Symfony webapp项目,并且遇到了JMS Serializer使用的时区问题。
简短版:
如何设置在我的symfony项目中使用的全局默认时区,无论项目是在浏览器中使用还是在命令行中使用?
(非常)长版:
date.timezone = "America/Chicago"
UTC
作为默认时区。 为实现这一目标,我只需将ini_set("date.timezone", "UTC");
添加到app.php
和app_dev.php
FrontControllers即可。由于每次访问应用程序都是通过这些文件进行路由,因此这种解决方案运行良好。
然而,此解决方案存在一个大问题:它仅在通过这些FrontControllers /在浏览器中使用应用程序时才有效。
当我使用控制台或任何其他命令行访问项目时,Frontcontrollers不会被使用,因此不会应用时区设置。
这是一个问题,例如清除和预热缓存时:
php app/console cache:clear --env=dev
由于php
直接在命令行上使用,因此使用全局php.ini
。因此应用了全局date.timezone = "America/Chicago"
。
似乎默认时区存储在appDevDebugProjectContainer.xml
缓存文件中,此外还为JMS Serializer缓存了时区:
$ 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);
因此,每次使用JMS(de)序列化对象时,都会将错误的时区应用于所有日期。当应用程序运行浏览器时(使用具有更改的默认时区的FrontControllers),情况就是如此。
当然,所有其他控制台命令的问题都是相同的,因为它们都使用全局的php.ini。 我该如何解决这个问题?
可能的解决方案:
America/Chicago
作为默认时区php
调用:Frontontrollers仍会为应用程序的所有“浏览器”调用设置时区。另外,我会为在命令行上使用php时用作参数的项目创建一个 php.ini:代码:
// in ./.bashrc
alias phpx='php -c /path/to/project/php.ini'
// use phpx instead of php
phpx app/console cache:clear --env=dev
此解决方案可行,但我不喜欢它:
结论:
是否有任何选项可以为整个Symfony项目全局设置默认时区?到目前为止,我只找到option that was used in Symfony 1.x,但没有找到Symfony 2.x的等效解决方案
有什么想法吗?
答案 0 :(得分:3)
嗯,有时答案很明显,人们看不到它。至少在此之前没有写一个长问题......: - )
在我发送问题后,我找到了答案:默认时区应该全局应用于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);
}
}