如何在Twig模板中呈现DateTime对象

时间:2011-11-29 22:54:33

标签: php symfony datetime twig

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

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

以下是代码段:

{% 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:类DateTime的对象无法转换为... \ app \ cache \ dev \ twig \ 9b \ ad \ 58fd3bb1517632badf1fdc7fa4a8.php中的字符串在第10行的“BeerBundle:Games:gameTable.html.twig”第33行。“

10 个答案:

答案 0 :(得分:282)

虽然你可以使用

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

方法,请记住,此版本不支持用户区域设置,这不应该是仅由一个国籍/地区的用户使用的网站的问题。国际用户应该显示完全不同的游戏日期,例如扩展\DateTime类,并向其添加__toString()方法,以检查区域设置并采取相应的行动。

修改

正如@Nic在评论中指出的那样,如果您使用Intl extension of Twig,则可以使用localizeddate过滤器,该过滤器会在用户的区域设置中显示日期。通过这种方式,您可以放弃我之前关于扩展\DateTime

的想法

答案 1 :(得分:87)

您可以使用date过滤器:

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

答案 2 :(得分:65)

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

静态日期格式

如果要显示静态格式,对于所有区域设置都是相同的(例如,对于Atom Feed,ISO 8601),您应该使用Twig&#39; 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&#39; s IntlDateFormatter)而不是自己进行本地化。它提供了一个过滤器localizeddate,它将使用本地化格式输出日期和时间。

localizeddate( date_format, time_format [, locale ] )

localizeddate的参数:

  • date_format:其中一个format strings(见下文)
  • time_format:其中一个format 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

中找到Intl扩展程序的安装说明

答案 3 :(得分:3)

别忘了

  

@ORM \ HasLifecycleCallbacks()

实体:

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

        return $this;
    }

查看:

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

&GT;&GT;输出2013-09-18 16:14:20

答案 4 :(得分:2)

有一个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

答案 5 :(得分:2)

{{game.gameDate | date('c')}}  // 2014-02-05T16:45:22+00:00

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

答案 6 :(得分:2)

你可以按照以下方式进行渲染

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

有关详细信息,请访问http://twig.sensiolabs.org/doc/filters/date.html

答案 7 :(得分:2)

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

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

答案 8 :(得分:1)

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

所以这就是我所需要的。

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

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

请参阅有关此内容的文档:

date in twig

答案 9 :(得分:1)

您可以使用ternary

的函数日期和twig运算符
{{ game.gameDate ? game.gameDate|date('d-m-Y H:i') : 'Not Available' }}