在网站内容运营中,日期和时间信息的正确展示至关重要,它不仅影响用户阅读体验,也直接关系到信息的时效性和准确性。安企CMS(AnQiCMS)深知这一点,并提供了强大且灵活的时间戳格式化标签,让开发者和运营者能够轻松地将后端存储的原始时间戳转换为前端用户直观易读的日期和时间格式。

为什么需要时间戳格式化?

我们知道,网站后台存储的数据,尤其是发布时间、更新时间、评论时间等,通常以时间戳(Unix timestamp)的形式存在。例如,你可能会看到一串数字 1678886400。这样的数字对于计算机来说是高效的,但对于访问网站的用户而言,却是毫无意义的。因此,我们需要一个机制,将这些原始的时间戳数据,根据用户的习惯和页面的设计需求,格式化成“2023年3月15日”、“今天下午3点”、“3小时前”等多种易读的形式。

安企CMS的解决方案:stampToDate 标签

安企CMS为此提供了一个专门的格式化时间戳标签——stampToDate。这个标签能够接收一个时间戳和一个格式字符串作为参数,并根据你定义的格式输出对应的日期和时间。

它的基本使用方法非常简洁明了: {{stampToDate(时间戳, "格式")}}

这里的关键在于两部分:

  1. 时间戳(时间戳:这通常是一个10位或13位的数字,代表从Unix纪元(1970年1月1日00:00:00 UTC)开始经过的秒数或毫秒数。在安企CMS中,例如文章的 CreatedTimeUpdatedTime,评论的 CreatedTime 等,都是以这种形式提供的。
  2. 格式("格式":这是定义日期和时间显示样式的字符串。安企CMS的这个格式字符串遵循Go语言的时间格式化规则,它不是传统的YYYY-MM-DD这样的占位符,而是使用一个特殊的“参考时间”来定义布局。

理解Go语言的时间格式化参考时间

Go语言的时间格式化比较独特,它使用一个固定的参考时间: 2006年01月02日 15时04分05秒 (对应 2006-01-02 15:04:05.000000000 -0700 MST

你可以将你希望显示的部分,替换成这个参考时间中对应的数字。例如:

  • 如果你想显示年份,就用2006
  • 如果你想显示月份,就用01(带前导零)或1(不带前导零)。
  • 如果你想显示日期,就用02(带前导零)或2(不带前导零)。
  • 如果你想显示小时,就用15(24小时制)或03(12小时制,需搭配PM/AM)。
  • 如果你想显示分钟,就用04
  • 如果你想显示秒数,就用05

通过组合这些数字,你就可以构建出各种复杂的日期时间格式。

常见格式化示例:

  • "2006-01-02":显示为 2023-03-15
  • "2006年01月02日":显示为 2023年03月15日
  • "15:04:05":显示为 14:30:00
  • "2006/01/02 15:04":显示为 2023/03/15 14:30
  • "Mon, 02 Jan 2006":显示为 Wed, 15 Mar 2023

实际应用场景:将后端时间戳呈现在前端

在安企CMS的模板开发中,我们经常会遇到需要展示时间戳的场景。例如,文章详情页面的发布和更新时间、文章列表中的条目时间、评论列表中每条评论的时间、甚至用户注册或最后登录的时间等。

以文章列表为例,假设我们要展示文章标题和它的发布时间、更新时间:

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

在这段代码中:

  • item.CreatedTimeitem.UpdatedTime 是从后端获取的原始时间戳。
  • stampToDate 标签接收这些时间戳。
  • 第一个 stampToDate 使用 "2006年01月02日 15:04" 格式,将时间戳转换为“年、月、日、时、分”的中文显示。
  • 第二个 stampToDate 使用 "2006/01/02" 格式,将时间戳转换为“年/月/日”的简洁显示。

通过这种方式,即使后端返回的是一串数字,前端也能根据预设的格式,以清晰、美观的方式呈现给用户。

进阶提示:区分时间类型与标签

安企CMS的模板引擎也提供了datetime过滤器,但请注意,这些过滤器主要用于处理Go语言中time.Time类型(表示日期和时间的对象),而不是直接处理原始的数字时间戳。如果你尝试将一个数字时间戳传递给datetime过滤器,很可能会遇到报错。

因此,当您明确知道数据源是一个“时间戳”时,请务必使用 stampToDate 标签,它就是为此目的而生。

如果您需要显示的是当前时间,而不是数据库中存储的特定事件时间,安企CMS还提供了{% now "格式" %}标签。例如,要在页脚显示当前年份: {% now "2006" %}

总结

通过stampToDate标签,您可以轻松地将后端存储的时间戳转换为用户友好的日期和时间格式,极大地提升了网站内容的可读性和用户体验。熟练掌握Go语言的参考时间格式,将是您在安企CMS中进行高效模板开发的关键。无论您需要展示精确到秒的时间,还是简洁的日期,stampToDate都能满足您的需求,确保日期和时间在前端的正确显示。


常见问题 (FAQ)

1. 为什么我直接在模板里使用 {{ item.CreatedTime }} 得到的是一串数字,而不是日期? 这是因为 item.CreatedTime 在后端数据库中通常以Unix时间戳(Timestamp)的形式存储,它代表从1970年1月1日至今的秒数。浏览器无法直接将其识别为可读的日期格式。您需要使用安企CMS提供的 stampToDate 标签对其进行格式化,才能在前端正确显示为日期和时间。

2. 我尝试使用 {{ item.CreatedTime|date:'YYYY-MM-DD' }} 过滤器,但页面报错了,这是为什么? 安企CMS的模板引擎中,date 过滤器是用来处理Go语言 time.Time 对象的,而不是直接处理原始数字时间戳。如果您想格式化时间戳,必须使用 stampToDate 标签,并按照Go语言的参考时间格式(如"2006-01-02")来定义日期格式,而不是使用YYYY-MM-DD等其他占位符。

3. 如果我只需要显示当前时间,而不是内容发布时间,应该用哪个标签? 如果您想在模板中显示当前的日期或时间,而不是从数据库中获取的特定内容的时间戳,您可以使用 {% now "格式" %} 标签。例如,{% now "2006年" %} 会显示当前的年份。格式字符串同样遵循Go语言的参考时间规则。