在 AnQiCMS 中管理网站内容,我们经常会遇到需要显示日期和时间的情况,例如文章的发布时间、更新时间,或者用户上次登录的时间等等。这些时间数据在 GoLang 后端通常以 time.Time 类型存储。当它们被传递到前端模板时,如果不进行适当的格式化,可能会显示为一串难以理解的时间戳或默认的Go语言格式,这显然不符合我们展示给访客的需求。
幸运的是,AnQiCMS 为我们提供了强大而灵活的模板标签和过滤器,可以轻松地将这些 GoLang 的 time.Time 变量格式化为我们想要的任何日期字符串格式。
核心利器:stampToDate 格式化标签
AnQiCMS 的模板引擎支持类似 Django 的语法,其中有一个非常实用的标签,专门用于格式化时间戳(或者说,那些从后端传入的代表时间的数字)。这个标签就是 stampToDate。
它的基本用法是:{{ stampToDate(时间戳变量, "格式化字符串") }}。
这里的关键在于第二个参数:“格式化字符串”。AnQiCMS 使用的是 GoLang 独特的“参考时间”来定义格式。这个参考时间是一个固定的日期:2006-01-02 15:04:05.999999999 -0700 MST。您不需要记住这个冗长的字符串,只需要理解它的每个部分代表的含义:
2006:代表年份(YYYY)01:代表月份(MM),例如01代表一月02:代表日期(DD),例如02代表每月的第二天15:代表小时(24小时制,HH),例如15代表下午3点04:代表分钟(mm),例如04代表4分钟05:代表秒钟(ss),例如05代表5秒
这意味着,如果您想将时间格式化为“年-月-日”的形式,您只需在格式化字符串中写入 "2006-01-02" 即可。如果您想要显示“月/日/年 时:分”,那么就可以写成 "01/02/2006 15:04"。
让我们看几个实际的例子来理解它的用法:
- 显示日期和时间:
{{ stampToDate(archive.CreatedTime, "2006-01-02 15:04:05") }}可能会显示为2023-10-27 10:30:45。 - 只显示日期:
{{ stampToDate(archive.CreatedTime, "2006年01月02日") }}可能会显示为2023年10月27日。 - 美式日期格式:
{{ stampToDate(archive.CreatedTime, "Jan 02, 2006") }}可能会显示为Oct 27, 2023。 - 只显示时间(小时:分钟):
{{ stampToDate(archive.CreatedTime, "15:04") }}可能会显示为10:30。
实践应用:从文档和用户数据中获取时间
在 AnQiCMS 中,许多地方都涉及时间数据。例如,当我们显示一篇文章的详情时,可以通过 archive.CreatedTime 和 archive.UpdatedTime 来获取创建和更新的时间。这些变量通常以时间戳的形式提供,可以直接传入 stampToDate 标签进行格式化。
假设我们正在编辑文章详情页的模板,可以这样显示文章的发布和更新时间:
<p>发布于:{{ stampToDate(archive.CreatedTime, "2006年01月02日 15:04") }}</p>
<p>最后更新:{{ stampToDate(archive.UpdatedTime, "2006-01-02 15:04") }}</p>
除了文章,用户模块也包含时间信息,例如用户的上次登录时间 user.LastLogin 或 VIP 过期时间 user.ExpireTime。您同样可以使用 stampToDate 来格式化这些数据:
<p>上次登录时间:{{ stampToDate(user.LastLogin, "2006-01-02") }}</p>
<p>VIP 过期日期:{{ stampToDate(user.ExpireTime, "2006年01月02日") }}</p>
如果需要显示当前时间或年份,AnQiCMS 也提供了 {% now %} 标签,它的用法与 stampToDate 的格式化部分类似:
<p>版权所有 © {% now "2006" %}</p>
<p>当前时间:{% now "2006-01-02 15:04:05" %}</p>
小心区分:stampToDate 与 date 过滤器
在 AnQiCMS 的模板中,您可能还会看到一个名为 date 的过滤器。这个过滤器也能格式化时间,但它与 stampToDate 有一个重要的区别:
stampToDate:专门用于处理时间戳(通常是 10 位或 13 位的数字,代表从 Unix 纪元开始的秒数或毫秒数)。这是 AnQiCMS 模板中最常用来格式化日期的方法,因为它后端会将数据库中的日期字段转换为时间戳传递给前端。date过滤器:用于格式化 GoLang 原生的time.Time对象。如果模板变量本身就是一个 GoLangtime.Time类型(而不是一个简单的数字时间戳),那么可以使用{{ 变量 | date:"格式化字符串" }}这样的语法。
重要提示: 大多数情况下,当我们从 AnQiCMS 的数据标签(如 archiveList、archiveDetail 等)中获取 CreatedTime 或 UpdatedTime 等时间字段时,它们会以时间戳的形式提供。因此,您应该优先使用 stampToDate 标签。如果错误地将时间戳传递给 date 过滤器,模板解析时可能会报错。
通过灵活运用 stampToDate 标签,配合 GoLang 精确的格式化字符串,您就可以在 AnQiCMS 网站上优雅地展示任何日期和时间信息,让您的网站内容更加易读和专业。
常见问题解答 (FAQ)
1. 为什么 stampToDate 的格式字符串看起来这么奇怪,使用的是 “2006-01-02 15:04:05” 这样的数字组合,而不是 “YYYY-MM-DD”?
这是 GoLang 语言特有的日期时间格式化方式,它使用一个固定的“参考时间” 2006-01-02 15:04:05.999999999 -0700 MST 来作为格式模式。您不需要记住具体的日期,只需理解这个参考时间中每个数字对应的含义:2006 代表年份,01 代表月份,02 代表日期,15 代表小时(24小时制),04 代表分钟,05 代表秒