Symfony2 / Twig的奇怪时区问题

时间:2015-07-08 17:26:49

标签: php symfony datetime timezone twig

我想在Symfony2应用程序中使用Twig显示日期时间时想出一个奇怪的时区问题,并且在尝试显示日期时间时,我在我的一个Twig模板上看到了一些问题。

首先,我检查了错误配置的所有内容:

  • 我的实体类具有定义为日期时间的私有属性,以及仅返回私有属性的公共getter方法。
  • MySQL的日期存储在我的时区(America / New_York);
  • 我的php.ini文件将我的默认时区设置为America / New_York。
  • 我没有调用twig的setTimezone()方法。
  • date_default_timezone_get()返回' America / New_York',来自网络和CLI。

现在为了奇怪

在MySQL中,我的实体已审核的数据为2015-07-08 11:16:00

在我的一个Twig模板中,我打电话:

  • {{ entity.reviewedAt|date('m/d/Y h:i a') }} 07/08/2015 @ 05:16 pm
  • {{ entity.reviewedAt|date('m/d/Y h:i a', false) }} 07/08/2015 @ 11:16 am

false参数告诉Twig use the timezone of the datetime object passed to the date filter

当我使用{{ dump(entity.reviewedAt) }}调试时,我得到:

object(DateTime)[879]
  public 'date' => string '2015-07-08 11:16:00.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'America/New_York' (length=16)
来自控制器的

var_dump($entity-getReviewedAt())返回与{{ dump(entity.reviewedAt) }};

完全相同的输出

这只发生在一个模板上。我网站上的其他模板使用date()过滤器显示同一字段,没有问题。

第一个问题:

为什么,当datetime对象已经与php.ini中的默认设置具有相同的时区时,我是否必须传递false参数?

甚至更奇怪:

我的实体是instance的孩子,其releaseDate。在MySQL中,此releaseDate存储为2015-07-02 00:00:00

当我使用{{ entity.instance.releaseDate|date('m/d/Y h:i a') }}相同模板中显示发布日期时,我会 07/02/2015 @ 12:00 am

因此,此属性正确显示,而不传递false作为第二个参数。但当我做{{ dump(entity.instance.releaseDate) }}时,我得到了:

object(DateTime)[5518]
  public 'date' => string '2015-07-02 00:00:00.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Europe/Copenhagen' (length=17)

我确信哥本哈根是一个美好的城市,但为什么我的约会时间到了那个?

如果我从控制器拨打var_dump($entity->getInstance()->getReleaseDate()),我会:

object(DateTime)[1592]
  public 'date' => string '2015-07-02 00:00:00.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'America/New_York' (length=16)

当我从控制器var_dump()拨打{{ entity.instance.releaseDate|date('m/d/Y h:i a') }}时显示 07/02/2015 @ 06:00 am 和{{1显示:

{{ dump(entity.instance.releaseDate) }}

第二个问题:

什么。的。哎呀?为什么Twig将时区显示为欧洲/哥本哈根,当我从控制器调用object(DateTime)[1592] public 'date' => string '2015-07-02 00:00:00.000000' (length=26) public 'timezone_type' => int 3 public 'timezone' => string 'America/New_York' (length=16) 时,为什么会回到America / New_York?

这可能与Doctrine2加载的代理类有关吗?当我var_dump()时,我确实看到该实例是一个Doctrine代理对象。

0 个答案:

没有答案