在网站内容管理中,时间信息的清晰展示对于用户体验至关重要。无论是文章的发布日期,还是评论的提交时间,一个符合阅读习惯的格式都能让信息传达更有效。AnQiCMS 提供了灵活的模板功能,让我们可以轻松地对时间戳进行格式化。

核心功能:AnQiCMS 的时间戳格式化标签 stampToDate

AnQiCMS 模板引擎内置了一个名为 stampToDate 的标签,专门用于处理时间戳的格式化。这个标签能够将 Unix 时间戳(通常是 10 位数字)转换为我们日常阅读的日期和时间字符串。它的使用方式非常简洁明了:

{{stampToDate(时间戳变量, "格式化字符串")}}

这里的关键在于第二个参数——“格式化字符串”。它并不是我们常见的 YYYY-MM-DD HH:mm 这类占位符,而是遵循 Go 语言独特的时间格式化规则。

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

Go 语言在设计时间格式化时,采用了一种非常独特且强大的方法。它不使用抽象的符号,而是通过一个固定的参考时间点来作为格式的模板。这个“魔术”参考时间是:

2006-01-02 15:04:05

要将时间戳格式化成你想要的样式,你需要将这个参考时间中对应的数字和分隔符,替换成你希望显示在最终结果中的样子。例如:

  • 如果你想显示年份,就使用 2006
  • 如果你想显示月份,就使用 01
  • 如果你想显示日期,就使用 02
  • 如果你想显示 24 小时制的小时,就使用 15
  • 如果你想显示分钟,就使用 04
  • 如果你想显示秒钟,就使用 05

如果参考时间中的某个部分(比如 06 代表 06 秒)在你的目标格式中不需要,那么就直接忽略它。

实际操作:将时间戳格式化为“年-月-日 时:分”

现在,让我们来解决核心问题:如何将 AnQiCMS 模板中的时间戳格式化为“年-月-日 时:分”的显示格式。

假设我们正在模板中遍历文章列表,并且每篇文章都有一个 CreatedTime 字段,它存储的是一个 Unix 时间戳。

为了达到“年-月-日 时:分”这个目标格式,我们对照 Go 语言的参考时间 2006-01-02 15:04:05

  • 2006 对应年份
  • 01 对应月份
  • 02 对应日期
  • 15 对应 24 小时制的小时
  • 04 对应分钟

因此,我们的格式化字符串应该写成 "2006年01月02日 15:04"

下面是一个在 archiveList 标签中使用的完整示例:

{% archiveList archives with type="list" limit="5" %}
    {% for item in archives %}
        <div class="article-item">
            <h2><a href="{{ item.Link }}">{{ item.Title }}</a></h2>
            <p class="article-meta">
                发布时间:{{ stampToDate(item.CreatedTime, "2006年01月02日 15:04") }}
                <span> - 浏览量:{{ item.Views }}</span>
            </p>
            <p>{{ item.Description }}</p>
        </div>
    {% endfor %}
{% endarchiveList %}

在这段代码中,item.CreatedTime 是文章的创建时间戳。通过 stampToDate 标签和 "2006年01月02日 15:04" 这个格式化字符串,最终显示在页面上的效果就会是类似 “2023年10月27日 10:30” 这样的格式。

常见应用场景

这种时间格式化方法在 AnQiCMS 模板中可以应用于多种场景:

  • 文章和产品详情页: 显示发布日期、更新日期。
  • 评论列表: 展示每条评论的提交时间。
  • 活动页面: 标注活动的开始和结束时间。
  • 用户中心: 显示用户注册时间、最后登录时间等。

无论在哪里需要将时间戳以特定的人性化格式展示,stampToDate 标签都能提供有效的解决方案。

注意事项

  • Go 语言格式的精确性: Go 语言的时间格式化规则非常严格,必须完全按照 2006-01-02 15:04:05 的相应部分来构建你的格式字符串。例如,如果你想显示两位数的年份,就必须使用 06 而不是 2006
  • 时间戳类型: stampToDate 标签期望接收的是 Unix 时间戳,通常是 10 位的整数(秒)。如果你的时间数据是其他格式(如 YYYY-MM-DD HH:mm:ss 字符串),则可能需要先进行转换才能使用。
  • date 过滤器区分: AnQiCMS 模板中还有一个 date 过滤器,但它要求传入的值是 Go 语言的 time.Time 类型对象,而不是时间戳。在处理时间戳时,请务必使用 stampToDate 标签。

通过 stampToDate 标签和对 Go 语言时间格式化规则的理解,您可以在 AnQiCMS 模板中轻松实现各种时间显示需求,为您的网站内容增添一份专业和易读性。


常见问题 (FAQ)

Q1: 为什么我使用 YYYY-MM-DD HH:mm 这样的格式字符串不起作用?

A1: AnQiCMS 的 stampToDate 标签采用的是 Go 语言的时间格式化规则,它不使用 Y/M/D/H/m 等占位符,而是通过一个固定的参考时间 2006-01-02 15:04:05 来构建格式。你需要将这个参考时间中对应的数字替换为你想显示的格式。例如,要显示年份,就使用 2006;要显示月份,就使用 01,以此类推。

Q2: stampToDate 标签支持 13 位的时间戳(毫秒)吗?

A2: stampToDate 标签默认期望接收的是 10 位的 Unix 时间戳(以秒为单位)。如果你的时间戳是 13 位的毫秒级时间戳,你需要先将其除以 1000 转换为秒,然后再传入 stampToDate 标签。例如:{{ stampToDate(item.CreatedTime / 1000, "2006年01月02日 15:04") }}

Q3: 除了“年-月-日 时:分”,我还能格式化成其他样式吗?

A3: 完全可以。只要你理解了 Go 语言的时间格式化规则,就可以灵活地组合出几乎任何你想要的日期时间格式。例如,要显示“周五, 10月27日 10:30 AM”,你可以尝试使用 "Mon, 02 Jan 2006 15:04:05 -0700" 这个参考时间中的不同部分,或者直接查阅 Go 语言官方文档中关于 time 包的格式化示例。