[英]Symfony + JMS Serializer: How to set default Timezone?
我正在開發一個Symfony webapp項目,並且JMS序列化器使用的時區有問題。
簡潔版本:
如何設置在我的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序列化程序緩存在以下位置:
$ 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對對象進行序列化時,都會將錯誤的時區應用於所有日期。 甚至在應用程序運行瀏覽器(使用具有更改的默認時區的FrontController)時也是如此。
當然,所有其他控制台命令的問題都相同,因為它們都使用全局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項目全局設置默認時區? 到目前為止,我只找到了Symfony 1.x中使用的選項,但沒有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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.