如何在AnQiCMS模板中对时间戳进行格式化输出?

作为一名熟悉安企CMS并精通内容运营的专业人士,我深知在网站内容展示中,时间的准确与美观至关重要。一个清晰易读的时间戳,不仅能提升用户体验,更是数据展示规范性的体现。下面,我将为您详细介绍如何在AnQiCMS模板中,对时间戳进行格式化输出。

AnQiCMS模板中时间戳格式化输出的详细指南

AnQiCMS作为一个高效、可定制的内容管理系统,其模板引擎支持类似Django的语法,为内容创作者和开发者提供了极大的灵活性。在构建动态页面时,经常需要展示文章发布时间、更新时间、用户登录时间等信息。这些时间通常以时间戳(Unix epoch秒)的形式存储在数据库中。为了让这些时间信息以用户友好的格式呈现,AnQiCMS提供了专门的模板标签进行格式化处理。

核心格式化标签:stampToDate

在AnQiCMS的模板系统中,对时间戳进行格式化输出的核心标签是stampToDate。这个标签允许您将10位的时间戳(通常称为Unix时间戳或Unix epoch秒)转换为您指定日期和时间格式的字符串。

stampToDate标签的基本使用方法如下:

{{ stampToDate(时间戳, "格式") }}

这里的“时间戳”是您需要格式化的10位数字,而“格式”则是定义输出日期和时间样式的字符串。

理解Go语言的时间格式化规则

AnQiCMS的后端基于Go语言开发,因此其stampToDate标签中的“格式”参数,严格遵循Go语言的time.Format函数所使用的特殊时间格式化规则。与许多编程语言使用YYYY-MM-DD这样的占位符不同,Go语言的格式化是基于一个固定的参考时间点:2006年1月2日15点04分05秒

您需要将这个参考时间点中的每个组件替换为您想要的相应格式。以下是一些常用的参考时间组件及其对应的含义:

  • : 2006 (完整年份,如2023) 或 06 (两位年份,如23)
  • : 01 (带前导零的月份,如08) 或 1 (不带前导零的月份,如8) 或 Jan (月份缩写,如Aug) 或 January (完整月份名称,如August)
  • : 02 (带前导零的日期,如09) 或 2 (不带前导零的日期,如9)
  • : 15 (24小时制,带前导零,如14) 或 3 (12小时制,不带前导零,如2) 或 03 (12小时制,带前导零,如02)
  • : 04 (带前导零的分钟,如07)
  • : 05 (带前导零的秒钟,如01)
  • AM/PM: PMpm (用于12小时制)
  • 星期: Mon (星期缩写,如Fri) 或 Monday (完整星期名称,如Friday)
  • 时区: MST (时区缩写,如CST) 或 -0700 (数字时区偏移,如+0800)

实际格式化示例

结合上述Go语言的格式化规则,我们可以构建各种常见的日期和时间输出格式。假设我们有一个时间戳变量 publishStamp,其值为 1609470335(对应2021年1月1日00:25:35 UTC+8),以下是一些格式化示例:

  • 显示为“2021年01月01日”:
    
    <div>发布日期:{{ stampToDate(publishStamp, "2006年01月02日") }}</div>
    
  • 显示为“2021-01-01”:
    
    <div>发布日期:{{ stampToDate(publishStamp, "2006-01-02") }}</div>
    
  • 显示为“01/01/2021”:
    
    <div>发布日期:{{ stampToDate(publishStamp, "01/02/2006") }}</div>
    
  • 显示为“2021-01-01 00:25”:
    
    <div>发布时间:{{ stampToDate(publishStamp, "2006-01-02 15:04") }}</div>
    
  • 显示为“2021-01-01 00:25:35”:
    
    <div>发布时间:{{ stampToDate(publishStamp, "2006-01-02 15:04:05") }}</div>
    
  • 显示为“星期五, 2021年1月1日”:
    
    <div>发布时间:{{ stampToDate(publishStamp, "Monday, 2006年1月2日") }}</div>
    
  • 仅显示月份和日期“01-01”:
    
    <div>发布月日:{{ stampToDate(publishStamp, "01-02") }}</div>
    
  • 仅显示小时和分钟“00:25”:
    
    <div>发布时分:{{ stampToDate(publishStamp, "15:04") }}</div>
    

在AnQiCMS各类标签中应用格式化

在AnQiCMS模板中,时间戳通常作为文档、评论、用户等数据对象的属性存在。您可以直接将这些属性作为stampToDate标签的第一个参数。

文档列表或详情中

在展示文章或产品列表时,我们经常需要显示其创建或更新时间。archiveListarchiveDetail标签返回的对象中包含CreatedTimeUpdatedTime属性,它们就是时间戳。

  • archiveList中:
    
    {% archiveList archives with type="list" limit="10" %}
        {% for item in archives %}
            <div>
                文章标题:{{ item.Title }}
                发布日期:{{ stampToDate(item.CreatedTime, "2006-01-02") }}
                更新时间:{{ stampToDate(item.UpdatedTime, "2006-01-02 15:04") }}
            </div>
        {% endfor %}
    {% endarchiveList %}
    
  • archiveDetail中:
    
    {% archiveDetail currentArchive with name="Title" %} {# 获取当前文档标题,作为示例 #}
    <div>
        当前文档标题:{{ currentArchive }}
        创建时间:{{ stampToDate(archive.CreatedTime, "2006年1月2日 15:04:05") }}
        修改时间:{{ stampToDate(archive.UpdatedTime, "最近更新于 2006-01-02") }}
    </div>
    
    (请注意,archive.CreatedTime等在archiveDetail上下文可直接使用,也可如上所示通过命名变量获取)

评论列表中

commentList标签返回的评论对象中包含CreatedTime属性。

{% commentList comments with archiveId=archive.Id type="list" limit="5" %}
    {% for item in comments %}
        <div>
            评论者:{{ item.UserName }}
            评论内容:{{ item.Content }}
            评论时间:{{ stampToDate(item.CreatedTime, "2006-01-02 15:04") }}
        </div>
    {% endfor %}
{% endcommentList %}

用户详情中

userDetail标签返回的用户对象中包含LastLoginExpireTime等时间戳属性。

{% userDetail userInfo with name="UserName" id="1" %} {# 示例:获取ID为1的用户信息 #}
<div>
    用户名:{{ userInfo }}
    上次登录:{{ stampToDate(user.LastLogin, "2006-01-02 15:04:05") }}
    VIP过期:{{ stampToDate(user.ExpireTime, "2006年1月2日") }}
</div>

(请注意,user.LastLogin等在userDetail上下文可直接使用,也可如上所示通过命名变量获取)

小结

通过stampToDate标签和理解Go语言独特的时间格式化规则,您可以在AnQiCMS模板中灵活地将时间戳转换为任何您需要的日期和时间格式。这不仅有助于提升网站的专业性和用户体验,也能确保时间信息的准确和一致展示。在实际操作中,建议您多尝试不同的格式组合,以找到最符合您网站设计风格和用户阅读习惯的呈现方式。


常见问题解答 (FAQ)

问:为什么AnQiCMS的时间格式化参数看起来很奇怪,不是常见的Y-m-d H:i:s

答:这是因为AnQiCMS后端使用Go语言开发,而Go语言在时间格式化方面采用了其特有的“参考时间”模式。它不是使用占位符,而是使用一个固定的参考时间 2006年1月2日15点04分05秒 来作为模板,您需要将您想要的格式映射到这个参考时间点上的相应位置。例如,如果您想显示四位年份,就写2006;想显示两位月份,就写01,以此类推。

问:如果我的时间戳不是10位而是13位(毫秒级),stampToDate标签还能用吗?

答:stampToDate标签默认接收10位的Unix epoch秒时间戳。如果您的时间戳是13位的毫秒级时间戳,您需要在传递给stampToDate之前将其除以1000,转换成秒级时间戳。例如:{{ stampToDate(item.MillisecondTime / 1000, "2006-01-02") }}。请确保除法结果是一个整数。

问:我可以直接在模板中获取当前时间并格式化吗?

答:是的,AnQiCMS提供了now标签来获取当前时间并进行格式化。其用法与stampToDate类似,只是不需要传递时间戳参数。例如:{% now "2006-01-02 15:04:05" %} 将会输出当前的日期和时间。如果您只需要年份,可以使用 {% now "2006" %}