【问题标题】:How to render a DateTime object in a Twig template如何在 Twig 模板中呈现 DateTime 对象
【发布时间】:2012-01-09 06:34:29
【问题描述】:

我的一个实体中的一个字段是“日期时间”变量。

如何将此字段转换为字符串以在浏览器中呈现?

这是一个代码sn-p:

{% for game in games %}
    ...
        <td> {{game.gameTeamIdOne.teamName}} </td>
        <td> {{game.gameTeamIdTwo.teamName}} </td>
        <td> {{game.gameDate}}</td>
    </tr>
{% endfor %}

这是我的实体类中的变量:

/**
 * @var date $gameDate
 *
 * @ORM\Column(name="GAME_DATE", type="datetime", nullable=true)
 */
private $gameDate;

这是我收到的错误消息:

在渲染模板期间抛出异常(“Catchable Fatal Error: Object of class DateTime could not be convert to string in ...\app\cache\dev\twig\9b\ad\58fd3bb1517632badf1fdc7fa4a8.php第 33 行") 在第 10 行的 "BeerBundle:Games:gameTable.html.twig" 中。

【问题讨论】:

    标签: php symfony datetime twig


    【解决方案1】:

    虽然你可以使用

    {{ game.gameDate|date('Y-m-d') }}
    

    方法,请记住,此版本不支持用户区域设置,这对于仅由一个国家的用户使用的网站应该不是问题。国际用户应该以完全不同的方式显示游戏日期,例如扩展 \DateTime 类,并为其添加 __toString() 方法以检查语言环境并采取相应措施。

    编辑

    正如@Nic 在评论中指出的那样,如果您使用Intl extension of Twig,您将有一个localizeddate 过滤器可用,该过滤器在用户的区域设置中显示日期。这样你就可以放弃我之前扩展\DateTime的想法。

    【讨论】:

    • {{ game.gameDate|date('Y-m-d H:i:s') }} 获取日期和时间。我在几分钟内找不到角色。
    • Twig 的日期函数使用与 php 函数相同的格式(来自 Twig 文档)。对于任何寻找其他格式的人,php.net/manual/en/function.date.php.
    • 注意空值;在类似的用例中,当将空值传递给 Twig 的 date 函数时,我看到了今天的日期。根据您的示例,您需要将其包装在 {% if game.gameDate is not empty %} ... {%endif}
    • 至于本地化,您不应该扩展DateTime 类!相反,simply use the localizeddate filter for Twig.
    • {% if game.gameDate %} {{ game.gameDate|date('Y-m-d H:i:s') }} {% endif %} 建议
    【解决方案2】:

    你可以使用date过滤器:

    {{ game.gameDate|date("m/d/Y") }}
    

    【讨论】:

    • 完全同意你的看法。这是默认情况下应该存在的东西。
    • @ThomasDecaux 实际上一点也不奇怪,因为__toString() 方法需要知道将DateTime 对象转换为哪种格式,并且可能有数百种可能的格式。当然,在 PHP 中,您可以在 DateTime 对象上使用 format() 方法,该对象采用格式参数,而 date 过滤器只是该方法的 Twig 等价物。
    【解决方案3】:

    这取决于您希望日期显示的格式。

    静态日期格式

    如果你想显示一个静态格式,它对所有语言环境都一样(例如 ISO 8601 用于 Atom 提要),你应该使用 Twig 的 date filter

    {{ game.gameDate|date('Y-m-d\\TH:i:sP') }}
    

    它总是会返回以下格式的日期时间:

    2014-05-02T08:55:41Z

    date 过滤器接受的格式字符串与用于PHP's date() function 的格式字符串相同。 (唯一的区别是,据我所知,您不能使用可在 PHP date() 函数中使用的预定义常量)

    本地化日期(和时间)

    但是,由于您想在浏览器中呈现它,您可能希望以人类可读的格式显示它,并针对用户的语言和位置进行本地化。您可以使用Intl Extension 来代替自己进行本地化(这利用了PHP 的IntlDateFormatter)。它提供了一个过滤器localizeddate,它将使用本地化格式输出日期和时间。

    localizeddate( date_format, time_format [, locale ] )
    

    localizeddate 的参数:

    • date_formatformat strings 之一(见下文)
    • time_formatformat strings 之一(见下文)
    • locale:(可选)使用它来覆盖配置的语言环境。保留这个参数以使用默认语言环境,可以在 Symfony 的配置中进行配置。

    (还有更多,请参阅the docs 了解可能参数的完整列表)

    对于date_formattime_format,您可以使用以下字符串之一:

    • 'none' 如果你不想包含这个元素
    • 'short' 表示最缩写的样式(12/13/52 或 3:30 下午在英语语言环境中)
    • 'medium' 用于中等风格(1952 年 1 月 12 日,英语语言环境)
    • 'long' 用于长样式(1952 年 1 月 12 日或下午 3:30:32,英语语言环境)
    • 'full' 用于完全指定的样式(1952 年 4 月 12 日星期二或太平洋标准时间下午 3:30:42,英语语言环境)

    示例

    因此,例如,如果您想以等同于 February 6, 2014 at 10:52 AM 的格式显示日期,请在 Twig 模板中使用以下行:

    {{ game.gameDate|localizeddate('long', 'short') }}
    

    但是,如果您使用不同的语言环境,则结果将针对该语言环境进行本地化:

    • 6 februari 2014 10:52 用于 nl 语言环境;
    • 6 février 2014 10:52 用于 fr 语言环境;
    • 6. Februar 2014 10:52 用于 de 区域设置; 等

    如您所见,localizeddate 不仅翻译月份名称,还使用本地符号。英文表示法将日期放在月份之后,而荷兰语、法语和德语表示法将日期放在月份之前。英语和德语月份名称以大写字母开头,而荷兰语和法语月份名称以小写字母开头。德语日期附加了一个点。

    安装/设置语言环境

    国际扩展的安装说明可以在this seperate answer找到。

    【讨论】:

    • 本地化日期(和时间) - 非常感谢@Nic - 太棒了!
    • 您好,使用本地化日期,您知道如何只输出 M 和 Y(不是日期)吗?谢谢
    • 如果您正在为输入类型“datetime-local”填充时间以在 TWIG 中正确呈现,请使用 Y-m-d\\TH:i
    【解决方案4】:

    我知道这是一个很老的问题,但我今天发现了这个问题,但答案不是我需要的。

    这就是我需要的。

    如果您,和我一样,希望在 twig 中显示当前日期,您可以使用以下内容:

    {{ "now"|date("m/d/Y") }}

    查看相关文档:

    date in twig

    【讨论】:

    • 这正是我想要的。谢谢!
    【解决方案5】:

    别忘了

    @ORM\HasLifecycleCallbacks()

    实体:

    /**
         * Set gameDate
         *
         * @ORM\PrePersist
         */
        public function setGameDate()
        {
            $this->dateCreated = new \DateTime();
    
            return $this;
        }
    

    查看:

    {{ item.gameDate|date('Y-m-d H:i:s') }}
    

    >> 输出 2013-09-18 16:14:20

    【讨论】:

      【解决方案6】:

      为避免空值错误,您可以使用以下代码:

      {{ game.gameDate ? game.gameDate|date('Y-m-d H:i:s') : '' }}
      

      【讨论】:

        【解决方案7】:
        {{game.gameDate | date('c')}}  // 2014-02-05T16:45:22+00:00
        

        对于包含时区偏移的完整日期时间字符串。

        【讨论】:

          【解决方案8】:

          有一个 symfony2 工具可以在当前语言环境中显示日期:

          {{ user.createdAt|localeDate }} to have a medium date and no time, in the current locale
          
          {{ user.createdAt|localeDate('long','medium') }} to have a long date and medium time, in the current locale
          

          https://github.com/michelsalib/BCCExtraToolsBundle

          【讨论】:

            【解决方案9】:

            你可以通过以下方式渲染

            {{ post.published_at|date("m/d/Y") }}

            更多详情可以访问http://twig.sensiolabs.org/doc/filters/date.html

            【讨论】:

              【解决方案10】:

              可以使用twig的函数日期和ternary运算符

              {{ game.gameDate ? game.gameDate|date('d-m-Y H:i') : 'Not Available' }}
              

              【讨论】:

                猜你喜欢
                • 2014-01-11
                • 2021-12-01
                • 1970-01-01
                • 1970-01-01
                • 2018-02-01
                • 2018-02-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多