我如何在Twig日期过滤器中使用时区?

时间:2011-03-31 09:26:12

标签: php datetime timezone datetime-format twig

我正在使用Twig和这个日期过滤器

http://www.twig-project.org/doc/templates.html#date

显然他们正在参数中寻找DateTime实例。

查看此http://www.php.net/manual/en/datetime.construct.php

我无法理解php datetime对象以及如何使用时区。

鉴于我了解基本的PHP并熟悉简单的网页编程,如何使用Twig日期过滤器显示日期和时间,同时满足时区要求?

如果在使用日期过滤器时有更简单的方法,但不使用datetime对象,我会对它开放。

我只担心解决方案有效,而不是解决方案的“正确性”或“优雅”。

6 个答案:

答案 0 :(得分:17)

Twig的“Date”过滤器接受第二个参数:“timezone”。

因此,您可以轻松显示所需的所有时区。例如:

{{ "now"|date("m/d/Y H:i", "Europe/Paris") }}
{{ "now"|date("m/d/Y H:i", "Asia/Calcutta") }}
{{ "now"|date("m/d/Y H:i", "Europe/Berlin") }}

了解更多信息: http://twig.sensiolabs.org/doc/filters/date.html#timezone

答案 1 :(得分:2)

我想你可能误读了文档。

  

日期过滤器接受DateTime和DateTime实例支持的任何日期格式。

这意味着您可以传递“2011-01-20 12:00:00 OR 等真实的DateTime对象。

但如果你不想这样做,你就不必处理这个对象。

现在,如果您需要该字符串将在特定时区显示,我会在将该时区设置为php之前将其传递给twig

$x = new DateTime("2010-01-01 12:00:00");
$x->setTimezone(new DateTimeZone("The Timezone you need"));
// pass to twig

答案 2 :(得分:2)

在今天的版本中,symfony应用程序配置文件支持它:

twig:
    date:
        timezone: Asia/Tokyo

http://symfony.com/blog/new-in-symfony-2-7-default-date-and-number-format-configuration

答案 3 :(得分:1)

我知道这个问题已经过时了,但这仅供参考。 默认情况下,Twig将使用在php ini文件中或全局应用程序中设置的默认时区,或者在twig中声明。

如果将datetime对象传递给带有时区的日期过滤器,则可以将false作为日期过滤器中的第二个参数传递。

C++

请参阅文档 twig date

答案 4 :(得分:0)

适合我的代码是

/**
originally the $post['created'] contains the value stored in database. 
this value was inserted assuming UTC format.
Best to do something like date_default_timezone_set('UTC'); 
which sets UTC application-wide 
**/

$time = new DateTime($post['created']);
$time->setTimezone(new DateTimeZone('Asia/Singapore')); // if you want Asia/Singapore

// probably the DateTimeZone has to be retrieved from database 
// since it could be user setting
// you can find the list of legit DateTimeZones in
// http://www.php.net/manual/en/timezones.php

$post['created'] = $time;

/**
Then $post is passed to Twig
**/

答案 5 :(得分:0)

对我有用的是添加一个新过滤器,因此它始终查看DateTime obj中的时区。 下面的示例将DateTime对象作为参数。

我可能不知道为什么Twig忽略了DateTime时区部分并使用默认的全局部分,所以我可能会遗漏某些东西。

在过滤器扩展中:

public function getFilters()
{
    return array(
    (...)
    new \Twig_SimpleFilter('date_tz', array($this, 'dateTzFilter')),
    );
}

public function dateTzFilter(\DateTime $dateTime)
{
    return $datTime->format('desired_format');
}