在AnQiCMS模板中处理时间戳并以特定日期格式展示,是内容运营中一项常见的需求。无论您是需要展示文章的发布时间,还是商品的更新日期,了解如何灵活地格式化时间都将大大提升网站内容的表现力。AnQiCMS 提供了简洁而强大的模板标签,让这一过程变得轻松便捷。

AnQiCMS 中的时间处理机制

AnQiCMS 的模板引擎设计类似于 Django 模板语法,它在时间处理上采用了标准的 Unix 时间戳作为内部存储格式,并在模板层提供了专门的标签进行格式化。这意味着在数据库或系统内部获取到的时间通常是一个 10 位的整数(例如 1678886400),它代表从 1970 年 1 月 1 日 00:00:00 UTC 到现在的秒数。

为了将这个原始的时间戳转化为我们日常生活中易于理解的日期和时间,AnQiCMS 提供了一个名为 stampToDate 的标签。这个标签的核心在于其对 Go 语言时间格式化规则的支持,理解这一点是掌握时间格式化的关键。

stampToDate 标签的使用方法

stampToDate 标签的基本语法非常直观:

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

这里有两个重要的组成部分:

  1. 时间戳 (Timestamp):这是一个 10 位的整数,代表您希望格式化的时间点。在 AnQiCMS 模板中,您通常会从 archiveitem 或其他数据对象中获取到这些时间戳字段,例如 archive.CreatedTimeitem.UpdatedTime
  2. 格式 (Format String):这是一个字符串,定义了时间戳将被格式化成的具体样式。AnQiCMS 沿用了 Go 语言的特殊参考时间 2006-01-02 15:04:05。这组看似随意的数字和时间,实际上在 Go 语言中有着特殊的含义,它们对应着特定的时间单位:
    • 2006 代表年份
    • 01 代表月份
    • 02 代表日期
    • 15 代表小时(24小时制)
    • 04 代表分钟
    • 05 代表秒
    • (其他如 PM 代表上下午,MST 代表时区等)

您只需要将您期望的日期时间格式,用 2006-01-02 15:04:05 这个参考时间来“模拟”出来即可。例如,如果您想显示 年-月-日,那么格式字符串就是 "2006-01-02"

在模板中获取时间戳并格式化

在 AnQiCMS 的模板中,您可以通过 archiveDetailarchiveList 等标签获取到文章、产品等内容的创建或更新时间。这些时间字段通常以 CreatedTime (创建时间) 或 UpdatedTime (更新时间) 命名,它们的值就是 10 位的时间戳。

让我们通过一个文章详情页的例子来看看如何应用:

假设您正在文章详情页 (archiveDetail),想要显示文章的发布日期:

{# 假设当前页面是文章详情页,直接通过 archive.CreatedTime 获取时间戳 #}
<p>发布日期:{{stampToDate(archive.CreatedTime, "2006年01月02日")}}</p>

如果您是在一个文章列表页 (archiveList) 中遍历文章,那么每个文章项的时间戳可以通过 item.CreatedTime 获取:

{% archiveList archives with type="page" limit="10" %}
    {% for item in archives %}
    <div>
        <h2><a href="{{item.Link}}">{{item.Title}}</a></h2>
        <p>发布于:{{stampToDate(item.CreatedTime, "2006-01-02 15:04")}}</p>
        <p>{{item.Description}}</p>
    </div>
    {% endfor %}
{% endarchiveList %}

实用案例与常见场景

根据不同的展示需求,您可以灵活调整格式字符串:

  1. 仅显示年份、月份和日期

    <p>发布日期:{{stampToDate(item.CreatedTime, "2006年01月02日")}}</p>
    {# 或者更简洁的横杠分隔 #}
    <p>发布日期:{{stampToDate(item.CreatedTime, "2006-01-02")}}</p>
    
  2. 显示完整日期和时间(精确到秒)

    <p>更新时间:{{stampToDate(item.UpdatedTime, "2006-01-02 15:04:05")}}</p>
    
  3. 仅显示月份和日期

    <p>日期:{{stampToDate(item.CreatedTime, "01月02日")}}</p>
    
  4. 仅显示小时和分钟

    <p>时间:{{stampToDate(item.CreatedTime, "15:04")}}</p>
    
  5. 自定义分隔符或文字: 您可以在格式字符串中加入任何文字或符号。

    <p>发布于:{{stampToDate(item.CreatedTime, "发布于 2006-01-02")}}</p>
    

几点注意事项

  • 时间戳的精确性stampToDate 标签期望接收一个 10 位的 Unix 时间戳(秒级)。如果您的时间戳是毫秒级(13位),您可能需要先进行处理,例如除以 1000,以转换为秒级时间戳。
  • Go 语言的时间格式特点:请牢记 Go 语言的参考时间 2006-01-02 15:04:05。所有格式字符串都应围绕这个日期和时间来构建,而不是使用 YYYY-MM-DD 这样的通用占位符。例如,要表示年份,您必须使用 2006,而不是 YYYY
  • date 过滤器的区别:AnQiCMS 模板也支持一个 date 过滤器(例如 {{ value|date:"2006-01-02" }}),但它设计用于处理 Go 语言中 time.Time 类型的数据,而不是原始的 10 位时间戳。对于从 archive.CreatedTime 等字段获取的原始时间戳,请务必使用 stampToDate 标签。

通过熟练运用 stampToDate 标签及其 Go 语言格式规则,您可以轻松地在 AnQiCMS 网站上呈现出美观、清晰且符合各种需求的时间信息,从而提升用户体验和内容的可读性。


常见问题 (FAQ)

Q1: 为什么在 stampToDate 中必须使用 2006-01-02 15:04:05 作为格式参考,而不是像其他系统那样使用 YYYY-MM-DD

A1: 这是 Go 语言的独特设计。Go 语言在格式化时间时,不使用像 YYYY-MM-DD 这样的抽象占位符,而是使用一个具体的参考日期时间 2006-01-02 15:04:05。它利用这个日期时间中的每个数字和符号来代表对应的时间单位(例如 2006 代表年份,01 代表月份)。您只需用这个参考日期来“构建”您想要的显示格式即可。

Q2: 如果我的时间戳不是 10 位(例如是 13 位毫秒级时间戳),stampToDate 标签还能正常工作吗?

A2: stampToDate 标签默认期望接收 10 位的 Unix 时间戳(秒级)。如果您的时间戳是 13 位(毫秒级),直接使用可能会导致格式化错误或显示不正确。在这种情况下,您可能需要在传递时间戳之前,通过一些逻辑(例如在 Go 代码层进行处理,或者在模板中尝试 {{ stampToDate(item.CreatedTime / 1000, "2006-01-02") }} 这种形式,具体取决于 AnQiCMS 是否支持模板内的简单数学运算)将其转换为 10 位秒级时间戳。

Q3: 除了内容发布时间,我还能在模板中显示当前的日期和时间吗?

A3: 是的,AnQiCMS 提供了 {% now %} 标签来显示当前的日期和时间。它的用法与 stampToDate 中的格式化规则类似,也遵循 Go 语言的参考时间格式。例如,要显示当前年份,您可以使用 {% now "2006" %}