我需要在UTC中将DateTime写入数据库,并在检索时将其转换为用户时区。每个用户都将他的时区设置在数据库中。
解决方案:按照here所述扩展Doctrine\DBAL\Types\DateTimeType
,以便它始终以UTC格式存在,并在需要时通过Twig将其转换回表示层中的用户时区。< / p>
问题:建议的方法会从系统默认时区转换UTC。为了使它工作,我需要在扩展的DateTimeType中读取实际的用户时区并进行转换。所以...我执行通常的依赖注入并注入SecurityContext,因为它将用户实体与时区值一起保存:
//TreasureForge\CoreBundle\DoctrineExtensions\DBAL\Types
private function __construct(SecurityContext $security)
{
$this->tz = $security->getToken()->getUser()->getTimezone();
}
和
treasure_forge.core_bundle.utc_datetime_extension:
class: TreasureForge\CoreBundle\DoctrineExtensions\DBAL\Types\UTCDateTimeType
arguments: ["@security.context"]
但它抛出:编译错误:无法覆盖最终方法Doctrine \ DBAL \ Types \ Type :: __ construct()
我甚至采用了糟糕,糟糕的方法,如:
global $kernel;
$tz = $kernel->getContainer()->get('security.context')->getToken()->getUser()->getTimezone();
这在每种可以想象的方式都是错误的,但即便如此,无论出于何种原因,getToken()有时会被设置,有时也不会在整个请求中出现,所以我对此可靠性存在严重怀疑。
有什么想法吗?
答案 0 :(得分:0)
您是否尝试在实体中执行此操作?
在你的getDate()
(或任何你的getter被叫)中,你应该获得用户时区。再次在setter(setDate()
)中你应该设置你所拥有的UTC时间。
请编写您的实体代码以便提供示例。