Symfony 3中如何设置时区?

12

我有一个Symfony 3应用程序,部署在Ubuntu 14.04服务器上。

当我在命令窗口执行"date"时,服务器会响应 "Fri May 11 10:02:30 CEST 2018",但是当我在twig中转储日期时间,例如"{{ dump("now"|date) }}",则响应为"May 11, 2018 04:04"

如果我在控制器函数(路由)的头部中放入"date_default_timezone_set("Europe/Madrid");",它可以正常工作,但我不想在所有控制器的所有函数中复制此行。

然后,我想知道在Symfony的配置中或全局设置此PHP命令(date_default_timezone_set("Europe/Madrid"))的位置,以适用于所有控制器。

谢谢

[编辑]

一种解决方法可能是将此代码放在控制器的头部,但我只想设置一次,而不是在所有控制器、服务等中设置:

public function __construct(){
    date_default_timezone_set("Europe/Madrid");
}

1
为什么不直接在php.ini中设置呢? - Iwan Wijaya
我尝试过了,但在Symfony中它没有改变,我不知道为什么。我尝试在以下位置更改时区:/etc/php/7.0/fpm/php.ini、/etc/php/7.0/cli/php.ini和/etc/php/7.0/fpm/php.ini,并重新启动Apache,但在Symfony中日期时间没有改变。 - Argoitz
1
你确定你正在编辑正确的php.ini文件吗?请查看这个相关问题:https://dev59.com/zGIi5IYBdhLWcg3w_QmH - fxbt
你的 php.ini 文件在哪里?你能展示一下到 php.ini 文件的路径吗? - Imanali Mamadiev
谢谢 @JovanPerovic,我会尝试的。 - Argoitz
显示剩余3条评论
3个回答

22
如果您无法在php.ini中设置它,或者希望确保该值与目标环境无关,最简单的方法是在您的AppBundle中设置它。
class AppBundle extends Bundle
{
    public function boot()
    {
        parent::boot();
        date_default_timezone_set("Europe/Madrid");
    }
}

或者,如果您没有AppBundle(或任何其他自己的bundle),您可以在加载bundle之前将其添加到AppKernel ::registerBundles()方法中。


2
谢谢!在Symfony 4中,我通过在Kernel.php文件的registerBundles方法中添加提到的代码行来解决了这个问题。 - cezar

0
<?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;
    }
}

你知道你会使用这个解决方案调用这个函数多少次吗? - Jimbo
1
没错。如果你像其他答案一样在启动时执行,它只会被执行一次。同样的结果,浪费更少的资源。 - Jimbo
啊,你可能是对的。但如果启动不是可行的解决方案,我会保留我的答案。 - HelpNeeder

0
你可以在 app/AppKernel.php 文件中检查是否定义了所有 Symfony 应用程序的时区。
它将覆盖默认的 PHP 配置时区。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接