在安企CMS的模板设计中,我们经常会遇到需要将时间戳数据以人类可读的日期格式展现出来的情况。无论是文章的发布时间、内容的更新日期,还是用户活动的记录,这些数据在数据库中通常以时间戳的形式存储。为了让网站访客能够清晰直观地了解到这些信息,掌握如何在模板中将时间戳转换为指定日期格式就显得尤为重要。

AnQiCMS中的时间戳:数据从何而来

在AnQiCMS中,您会发现很多与时间相关的数据字段都以时间戳的形式存在,例如文章详情标签(archiveDetail)和文章列表标签(archiveList)中的CreatedTime(创建时间)和UpdatedTime(更新时间),以及评论列表标签(commentList)中的CreatedTime,还有用户详情标签(userDetail)中的LastLogin(上次登录时间)和ExpireTime(VIP到期时间)等。这些时间戳通常是一个10位的整数,代表着自Unix纪元(1970年1月1日00:00:00 UTC)以来经过的秒数。

直接显示这些10位数字对于普通用户来说毫无意义,因此我们需要将它们转换为“2023年3月15日”、“昨天 14:30”或者“03-15”等易于理解的格式。

核心功能:stampToDate 标签登场

AnQiCMS为此提供了一个专门的模板标签——stampToDate,它能够轻松地将时间戳转换为您想要的日期格式。这个标签的使用方式非常直观,只需要提供两个参数:您想要转换的时间戳,以及一个定义输出格式的字符串。

其基本语法是:{{stampToDate(您的时间戳变量, "您的格式字符串")}}

理解这两个参数是成功转换的关键。

  1. 您的时间戳变量:这里通常是您通过其他标签(如archiveListarchiveDetail)获取到的数据字段,比如item.CreatedTimearchive.UpdatedTime。请注意,它必须是一个10位的Unix时间戳(秒级)。

  2. 您的格式字符串:这是决定日期输出格式的“魔法咒语”。AnQiCMS基于Go语言开发,因此这里的格式字符串遵循Go语言特有的日期格式化标准。这个标准使用一个特定的参考日期——2006年01月02日 15时04分05秒 -0700 MST(或者简单记作 2006-01-02 15:04:05)来作为格式化的模板。您需要将这个参考日期中的各个组成部分替换成您希望显示实际日期对应的值。

    例如:

    • 2006 代表年份(四位数)
    • 01 代表月份(两位数,不足补零)
    • 02 代表日期(两位数,不足补零)
    • 15 代表小时(24小时制,两位数,不足补零)
    • 04 代表分钟(两位数,不足补零)
    • 05 代表秒(两位数,不足补零)

    通过组合这些“魔法数字”,您可以创建出各种各样的日期格式。

如何使用 stampToDate 标签

让我们通过几个具体的例子来了解如何在AnQiCMS模板中运用stampToDate标签。假设我们有一个时间戳 1678886400,它对应的是 2023-03-15 00:00:00

  • 显示为“年-月-日”

    <p>发布日期:{{stampToDate(item.CreatedTime, "2006-01-02")}}</p>
    {# 输出: 发布日期:2023-03-15 #}
    
  • 显示为“年月日时分秒”

    <p>更新时间:{{stampToDate(archive.UpdatedTime, "2006年01月02日 15时04分05秒")}}</p>
    {# 输出: 更新时间:2023年03月15日 00时00分00秒 #}
    
  • 显示为“月/日 时:分”

    <p>登录时间:{{stampToDate(user.LastLogin, "01/02 15:04")}}</p>
    {# 输出: 登录时间:03/15 00:00 #}
    
  • 显示为纯年份

    <p>版权年份:{{stampToDate(someTimestamp, "2006")}}</p>
    {# 输出: 版权年份:2023 #}
    

常见应用场景示例

stampToDate标签集成到实际模板中,能极大地提升信息呈现的专业度。

  1. 在文章列表页显示文章发布日期: 当您使用archiveList标签循环输出多篇文章时,可以这样展示每篇文章的发布时间:

    {% archiveList archives with type="page" limit="10" %}
        {% for item in archives %}
            <div>
                <h3><a href="{{item.Link}}">{{item.Title}}</a></h3>
                <p>发布于:<span>{{stampToDate(item.CreatedTime, "2006年01月02日")}}</span></p>
                <p>{{item.Description}}</p>
            </div>
        {% endfor %}
    {% endarchiveList %}
    
  2. 在文章详情页显示内容的更新时间: 在文章详情页中,您可能需要显示文章的创建时间和最新的更新时间,以便读者了解内容的及时性:

    <article>
        <h1>{% archiveDetail with name="Title" %}</h1>
        <p>
            <span>发布日期:{{stampToDate(archive.CreatedTime, "2006-01-02")}}</span>
            <span>最后更新:{{stampToDate(archive.UpdatedTime, "2006-01-02 15:04")}}</span>
        </p>
        <div class="content">
            {%- archiveDetail articleContent with name="Content" %}
            {{articleContent|safe}}
        </div>
    </article>
    

    这里我们假设archive是当前文章详情的数据对象。

  3. 显示用户相关的时间信息: 如果您的网站有用户中心,可能需要显示用户的VIP到期时间:

    {% userDetail user with name="Id" id="当前用户ID" %}
    <p>您的VIP将于:<span>{{stampToDate(user.ExpireTime, "2006年01月02日")}}</span> 到期。</p>
    {% enduserDetail %}
    

    当然,在实际使用时,您需要根据实际页面上下文获取user.ExpireTime这个时间戳变量。

一个小提醒:date 过滤器与 stampToDate 的区别

AnQiCMS的模板系统中,除了stampToDate标签,您可能还会看到一个名为date的过滤器。这里需要特别注意,date过滤器是Go语言模板引擎原生支持的,它期望处理的是Go语言原生的time.Time类型(一种日期时间对象),而不是我们此处讨论的10位Unix时间戳(整数)。

如果您尝试将一个时间戳直接传递给date过滤器,模板解析时很可能会报错。stampToDate标签