在网站运营中,内容发布时间、更新时间等日期和时间信息对用户体验和内容管理都至关重要。AnQiCMS 作为一款功能丰富的内容管理系统,提供了灵活的模板标签,让用户能够轻松地将后台存储的时间戳数据,格式化成各种易读的日期或时间字符串,以适应不同的展示需求。
理解 AnQiCMS 中的时间戳
在 AnQiCMS 内部,大部分日期和时间字段,如文章的 CreatedTime(创建时间)或 UpdatedTime(更新时间),都以 Unix 时间戳的形式存储。这是一个 10 位的整数,代表从 1970 年 1 月 1 日 00:00:00 UTC 到现在的秒数。虽然这种格式便于系统存储和处理,但直接展示给用户则显得不够直观。因此,我们需要将其转换为人类可读的日期或时间格式。
核心功能:stampToDate 标签
AnQiCMS 提供了一个专门的模板标签 stampToDate 来解决时间戳格式化的问题。这个标签的使用方式非常简洁直观,它接受两个参数:
- 时间戳变量:需要被格式化的时间戳,通常是您从内容模型中获取的字段,例如
item.CreatedTime。 - 格式字符串:一个用于定义输出格式的字符串。
基本的语法结构是:{{stampToDate(时间戳变量, "格式字符串")}}。
格式字符串的奥秘:Go 语言的参考时间
这里需要特别注意“格式字符串”的写法。AnQiCMS 底层基于 Go 语言开发,因此在日期时间格式化上遵循 Go 语言的惯例。这意味着您不会使用像 Y-m-d H:i:s 这样的占位符,而是使用一个特殊的“参考时间”来定义您想要的输出样式。这个参考时间就是:2006-01-02 15:04:05。
您可以把这个参考时间想象成一个模板,您希望日期时间怎么显示,就用这个参考时间对应着写出来。例如:
- 如果希望显示年份(
2006),就将格式字符串中的2006保留。 - 如果希望显示月份(
01),就将格式字符串中的01保留。 - 以此类推,
02代表日,15代表小时(24小时制),04代表分钟,05代表秒。
下面是一些常见的格式化示例:
- 只显示日期(年-月-日):如果您希望日期以
2023-01-01的形式显示,那么格式字符串就写成"2006-01-02"。 - 显示完整日期和时间:如果需要
2023-01-01 12:30:00这样的输出,格式字符串就是"2006-01-02 15:04:05"。 - 自定义分隔符:想要
2023年01月01日这样的中文格式,可以写成"2006年01月02日"。如果希望是01/01/2023,则写成"01/02/2006"。 - 只显示时间:例如
12:30:00,格式字符串为"15:04:05"。 - 显示简短年月:如果只需要
01-02(月-日),可以写成"01-02"。
在模板中的实际应用
在 AnQiCMS 的模板中,您可以通过 archiveList、archiveDetail、commentList 等标签获取到包含时间戳的数据项。然后,将这些数据项的时间戳字段传递给 stampToDate 标签进行格式化。
例如,在一篇文章列表页,我们希望显示每篇文章的发布日期:
{% archiveList archives with type="page" limit="10" %}
{% for item in archives %}
<li>
<a href="{{item.Link}}">
<h5>{{item.Title}}</h5>
<div>
<span>发布时间:{{stampToDate(item.CreatedTime, "2006年01月02日")}}</span>
<span>阅读量:{{item.Views}}</span>
</div>
</a>
</li>
{% endfor %}
{% endarchiveList %}
在文章详情页,我们可能需要显示更详细的更新时间:
{% archiveDetail archiveDetailData %}
<h1>{{archiveDetailData.Title}}</h1>
<p>
<span>发布于:{{stampToDate(archiveDetailData.CreatedTime, "2006-01-02 15:04")}}</span>
{% if archiveDetailData.CreatedTime != archiveDetailData.UpdatedTime %}
<span>更新于:{{stampToDate(archiveDetailData.UpdatedTime, "2006-01-02 15:04:05")}}</span>
{% endif %}
</p>
<div>
{{archiveDetailData.Content|safe}}
</div>
{% endarchiveDetail %}
小贴士:time.Time 类型与 date 过滤器
AnQiCMS 的模板中确实存在一个 date 过滤器,但它要求传入的变量必须是 Go 语言的 time.Time 对象,而不是原始的 Unix 时间戳。如果我们直接将时间戳传递给 date 过滤器,系统通常会报错或不按预期工作。因此,处理从数据库或内容模型中获取的原始 Unix 时间戳时,请务必使用 stampToDate 标签,它是为此类场景专门设计的。
如果您只是想获取并格式化当前的服务器时间,而不需要处理特定内容的时间戳,可以方便地使用 {% now "格式字符串" %} 标签,例如 {% now "2006-01-02 15:04" %} 会直接输出当前日期和时间。
通过 stampToDate 标签,AnQiCMS 让时间戳的格式化输出变得既简单又强大,满足了网站内容展示的各种精细化需求。