【问题标题】:how do i use timezone in Twig date filter?如何在 Twig 日期过滤器中使用时区?
【发布时间】:2011-03-31 09:26:12
【问题描述】:

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

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

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

看着这个http://www.php.net/manual/en/datetime.construct.php

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

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

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

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

【问题讨论】:

    标签: php datetime timezone datetime-format twig


    【解决方案1】:

    Twig 的“日期”过滤器接受第二个参数:“时区”。

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

    {{ "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

    【讨论】:

      【解决方案2】:

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

      如果您使用 timezone 将 datetime 对象传递给日期过滤器,那么您可以将 false 作为日期过滤器中的第二个参数传递。

      {{ dateForSomething | date('theFormatIWant', false) }}
      

      请参考文档 twig date

      【讨论】:

      • 这个答案对我帮助很大。谢谢。
      【解决方案3】:

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

      twig:
          date:
              timezone: Asia/Tokyo
      

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

      【讨论】:

      • 这将设置全局时区。
      【解决方案4】:

      我认为您可能误读了文档。

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

      这意味着您可以只传递诸如“2011-01-20 12:00:00一个真正的 DateTime 对象之类的东西。

      但如果你不想做,你不必处理对象。

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

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

      【讨论】:

      • 嗯,我成功地按照你说的做了,但它仍然显示我存储在数据库中的原始日期时间值。请指教。
      • $x = new DateTime("2010-01-01 12:00:00"); $x->setTimezone('亚洲/新加坡'); // 在+8中
      • 假设原始日期时间为 UTC 格式。尝试在应用程序范围内设置它
      • 只是想补充一点,就我而言,我必须这样做 $x->setTimezone(new DateTimeZone("Australia/Perth"));注意“新的 DateTimeZone()”(php.net/manual/en/datetime.settimezone.php)
      【解决方案5】:

      对我有用的是添加一个新过滤器,因此它始终查看 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');
      }
      

      【讨论】:

        猜你喜欢
        • 2013-12-30
        • 2012-06-03
        • 1970-01-01
        • 2013-10-10
        • 1970-01-01
        • 2014-11-19
        • 2022-10-20
        • 2017-10-03
        • 2021-12-19
        相关资源
        最近更新 更多