Symfony2:在何处设置用户定义的时区

Chr*_*nel 6 php timezone symfony

我对当前项目的要求之一是允许用户为其帐户选择时区,然后将此时区用于整个站点中的所有日期/时间相关功能.

我看到它的方式,我有两个选择:

  • 将DateTimeZone对象传递给DateTime的每个新DateTime的构造函数
  • 使用PHP设置默认时区 date_default_timezone_set()

似乎使用date_default_timezone_set是要走的路,但我不确定我应该在哪里设置它.因为时区在用户之间会有所不同,而且整个站点都使用了DateTime,所以我需要将它设置在一个会影响所有页面的地方.

也许我可以写一个成功登录后设置它的事件监听器?如果我采用这种方法,它是否会在所有页面上保持设置,还是仅按页面设置?

我很想听听其他人如何接近这一点.

Eln*_*mov 14

是的,你可以使用一个事件监听器,挂钩kernel.request事件.

这是我的一个项目的监听器:

<?php
namespace Vendor\Bundle\AppBundle\Listener;

use Symfony\Component\Security\Core\SecurityContextInterface;
use Doctrine\DBAL\Connection;
use JMS\DiExtraBundle\Annotation\Service;
use JMS\DiExtraBundle\Annotation\Observe;
use JMS\DiExtraBundle\Annotation\InjectParams;
use JMS\DiExtraBundle\Annotation\Inject;

/**
 * @Service
 */
class TimezoneListener
{
    /**
     * @var \Symfony\Component\Security\Core\SecurityContextInterface
     */
    private $securityContext;

    /**
     * @var \Doctrine\DBAL\Connection
     */
    private $connection;

    /**
     * @InjectParams({
     *     "securityContext" = @Inject("security.context"),
     *     "connection"      = @Inject("database_connection")
     * })
     *
     * @param \Symfony\Component\Security\Core\SecurityContextInterface $securityContext
     * @param \Doctrine\DBAL\Connection $connection
     */
    public function __construct(SecurityContextInterface $securityContext, Connection $connection)
    {
        $this->securityContext = $securityContext;
        $this->connection      = $connection;
    }

    /**
     * @Observe("kernel.request")
     */
    public function onKernelRequest()
    {
        if (!$this->securityContext->isGranted('ROLE_USER')) {
            return;
        }

        $user = $this->securityContext->getToken()->getUser();
        if (!$user->getTimezone()) {
            return;
        }

        date_default_timezone_set($user->getTimezone());
        $this->connection->query("SET timezone TO '{$user->getTimezone()}'");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @elnur,假设我的服务器设置为"UTC",用户设置为"America/Caracas".使用您的解决方案,当用户在某个实体字段中提交日期时间时会发生什么?日期时间是否与用户时区一起存储(与用户输入的值相比没有变化)或服务器时区(更改的值与UTC时间相匹配)? (3认同)