首页 文章

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

提问于
浏览
195

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

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

这是一段代码:

{% 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第33行中的字符串“)在第10行的”BeerBundle:Games:gameTable.html.twig“中 .

8 回答

  • 65

    虽然你可以使用

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

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

    Edit

    正如@Nic在评论中指出的那样,如果您使用Intl extension of Twig,您将拥有一个 localizeddate 过滤器,它会在用户的语言环境中显示日期 . 通过这种方式,您可以放弃我之前扩展 \DateTime 的想法 .

  • 272

    你可以使用date过滤器:

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

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

    静态日期格式

    如果要显示静态格式,对于所有语言环境都是相同的(例如,对于Atom提要是ISO 8601),您应该使用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_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') }}
    

    但是,如果使用其他语言环境,则结果将针对该语言环境进行本地化:

    对于 nl 语言环境,

    • 6 februari 2014 10:52 ;
      对于 fr 语言环境,
    • 6 février 2014 10:52 ;
      _159172_为 de 语言环境的
    • 6. Februar 2014 10:52 ;等等

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

    安装/设置区域设置

    可以在this seperate answer中找到Intl扩展的安装说明 .

  • 3

    Dont forget

    @ORM \ HasLifecycleCallbacks()

    Entity :

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

    View:

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

    产出2013-09-18 16:14:20

  • 85

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

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

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

  • 2

    你可以用以下方式渲染

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

    欲了解更多详情,请访问http://twig.sensiolabs.org/doc/filters/date.html

  • 2

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

    所以这就是我需要的 .

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

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

    请参阅有关此文档:

    date in twig

相关问题