如何在 symfony 3 中设置时区?
How can I set timezone in symfony 3?
我在 Ubuntu 14.04 服务器上部署了一个 symfony 3 应用程序。
当我在命令window中执行"date"时,服务器响应我"Fri May 11 10:02:30 CEST 2018" 但是当我将日期时间转储到树枝中时 "{{ dump("now" |date) }}",响应是"May 11, 2018 04:04".
如果我输入控制器函数(路由)的header,"date_default_timezone_set("Europe/Madrid");" 它工作正常,但我不想在所有控制器的所有功能中复制这一行。
然后,我想知道我在哪里可以将时区设置为 Symfony 的配置,或者我可以在哪里设置这个 PHP 命令(date_default_timezone_set( "Europe/Madrid")) 所有控制器全局。
谢谢
[编辑]
一个解决方案可能是将此代码放在控制器的 header 中,但我想将其设置为一个,而不是在所有控制器、服务等中......:[=11=]
public function __construct(){
date_default_timezone_set("Europe/Madrid");
}
<?php
namespace App\EventSubscriber;
use App\Manager\EventManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Twig\Environment;
use Twig\Extension\CoreExtension;
/**
* Class TimeZoneListener
*
* @package App\EventListener
*/
class TimeZoneSubscriber implements EventSubscriberInterface
{
/** @var Environment */
private $environment;
/** @var EventManager */
private $manager;
/** @var string */
private $timezone;
/**
* TimeZoneListener constructor.
*
* @param Environment $environment
* @param EventManager $manager
* @param string $timezone
*/
public function __construct(Environment $environment, EventManager $manager, string $timezone)
{
$this->environment = $environment;
$this->manager = $manager;
$this->timezone = $timezone;
}
/**
* @return array|null
*/
public static function getSubscribedEvents(): ?array
{
return [
KernelEvents::CONTROLLER => 'setTimeZone',
];
}
public function setTimeZone(FilterControllerEvent $filterControllerEvent)
{
if (!$this->environment instanceof Environment) {
return;
}
// decide correct timezone either default or event defined
$event = $this->manager->getActiveEvent();
$timezone = null === $event ? $this->timezone : $event->getTimezone();
/**
* set twig default time zone
*
* @var CoreExtension $core
*/
$core = $this->environment->getExtension('Twig_Extension_Core');
$core->setTimezone($timezone);
return $this->environment;
}
}
如果您无法在 php.ini
中设置它,或者您想确保该值独立于目标环境而保持一致,最简单的方法是在您的 AppBundle 中设置它:
class AppBundle extends Bundle
{
public function boot()
{
parent::boot();
date_default_timezone_set("Europe/Madrid");
}
}
或者,如果您没有 AppBundle(或任何其他自己的捆绑包),您可以在加载捆绑包之前将其添加到 AppKernel::registerBundles()
方法。
如果您的所有 symfony 应用程序的时区都已定义,您可以签入 app/AppKernel。php/
它将超越默认的 php 会议时区
我在 Ubuntu 14.04 服务器上部署了一个 symfony 3 应用程序。
当我在命令window中执行"date"时,服务器响应我"Fri May 11 10:02:30 CEST 2018" 但是当我将日期时间转储到树枝中时 "{{ dump("now" |date) }}",响应是"May 11, 2018 04:04".
如果我输入控制器函数(路由)的header,"date_default_timezone_set("Europe/Madrid");" 它工作正常,但我不想在所有控制器的所有功能中复制这一行。
然后,我想知道我在哪里可以将时区设置为 Symfony 的配置,或者我可以在哪里设置这个 PHP 命令(date_default_timezone_set( "Europe/Madrid")) 所有控制器全局。
谢谢
[编辑]
一个解决方案可能是将此代码放在控制器的 header 中,但我想将其设置为一个,而不是在所有控制器、服务等中......:[=11=]
public function __construct(){
date_default_timezone_set("Europe/Madrid");
}
<?php
namespace App\EventSubscriber;
use App\Manager\EventManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Twig\Environment;
use Twig\Extension\CoreExtension;
/**
* Class TimeZoneListener
*
* @package App\EventListener
*/
class TimeZoneSubscriber implements EventSubscriberInterface
{
/** @var Environment */
private $environment;
/** @var EventManager */
private $manager;
/** @var string */
private $timezone;
/**
* TimeZoneListener constructor.
*
* @param Environment $environment
* @param EventManager $manager
* @param string $timezone
*/
public function __construct(Environment $environment, EventManager $manager, string $timezone)
{
$this->environment = $environment;
$this->manager = $manager;
$this->timezone = $timezone;
}
/**
* @return array|null
*/
public static function getSubscribedEvents(): ?array
{
return [
KernelEvents::CONTROLLER => 'setTimeZone',
];
}
public function setTimeZone(FilterControllerEvent $filterControllerEvent)
{
if (!$this->environment instanceof Environment) {
return;
}
// decide correct timezone either default or event defined
$event = $this->manager->getActiveEvent();
$timezone = null === $event ? $this->timezone : $event->getTimezone();
/**
* set twig default time zone
*
* @var CoreExtension $core
*/
$core = $this->environment->getExtension('Twig_Extension_Core');
$core->setTimezone($timezone);
return $this->environment;
}
}
如果您无法在 php.ini
中设置它,或者您想确保该值独立于目标环境而保持一致,最简单的方法是在您的 AppBundle 中设置它:
class AppBundle extends Bundle
{
public function boot()
{
parent::boot();
date_default_timezone_set("Europe/Madrid");
}
}
或者,如果您没有 AppBundle(或任何其他自己的捆绑包),您可以在加载捆绑包之前将其添加到 AppKernel::registerBundles()
方法。
如果您的所有 symfony 应用程序的时区都已定义,您可以签入 app/AppKernel。php/
它将超越默认的 php 会议时区