在AnqiCMS中管理网站内容,我们经常需要展示文章的发布时间、更新时间,或是用户的注册与登录时间等。这些时间信息通常以“时间戳”的形式存储在数据库中,也就是一串数字。如果直接在网站前端显示这些数字,不仅不直观,也缺乏美观度。好在AnqiCMS提供了非常灵活的模板标签,让我们能够轻松地将这些时间戳格式化成我们想要的日期和时间显示格式。

AnqiCMS的模板系统,借鉴了Django模板引擎的语法风格,功能强大且易于上手。它内置了一个专门用于格式化时间戳的标签——stampToDate,通过这个标签,我们可以将原始的时间戳转化为各种自定义的日期和时间字符串,无论是显示年份、月份、日期,还是精确到小时、分钟、秒,都能轻松实现。

理解AnqiCMS的时间戳和格式化模式

在深入了解stampToDate标签之前,我们首先需要知道AnqiCMS模板中时间戳的来源以及它的格式化机制。时间戳通常是一个10位或13位的整数(Unix时间戳),代表从1970年1月1日00:00:00 UTC到当前时间的秒数或毫秒数。AnqiCMS的stampToDate标签主要处理10位的秒级时间戳。

而格式化模式,则是AnqiCMS特有的、基于Go语言风格的“布局字符串”。与我们常见的Y-m-d H:i:s这类模式不同,Go语言使用一个特定的参考日期——2006年01月02日15时04分05秒来定义日期和时间的各个部分。这意味着,你想要显示“年”,就写“2006”;想要显示“月”,就写“01”;想要显示“日”,就写“02”,以此类推。

下面是一些常用的格式化模式示例,方便我们理解和使用:

  • 年份: 2006
  • 月份(两位数字): 01
  • 月份(缩写): Jan
  • 月份(完整): January
  • 日期(两位数字): 02
  • 星期(缩写): Mon
  • 星期(完整): Monday
  • 小时(24小时制): 15
  • 小时(12小时制): 0304
  • 分钟: 04
  • 秒数: 05
  • AM/PM: PMpm

你可以根据这些“参考值”自由组合,来创建任何你想要的日期时间格式。

核心操作:使用stampToDate标签

stampToDate标签的使用方法非常直观,它的基本语法是:

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

这里,时间戳变量通常是从后端获取到的数据字段,比如文章对象的CreatedTime(创建时间)或UpdatedTime(更新时间),用户对象的LastLogin(上次登录时间)等。格式化模式字符串就是我们上面提到的,根据Go语言风格组合的日期时间布局。

让我们通过一些实际的例子来看看如何应用:

假设我们正在循环显示一个文章列表,其中每篇文章都有一个CreatedTime字段,它是一个时间戳。

{% archiveList archives with type="list" limit="5" %}
    {% for item in archives %}
    <div class="article-card">
        <h3><a href="{{item.Link}}">{{item.Title}}</a></h3>
        <p class="description">{{item.Description}}</p>
        <p class="meta">
            <!-- 显示为 "2023-10-26" -->
            发布于:<span>{{stampToDate(item.CreatedTime, "2006-01-02")}}</span>
            <!-- 显示为 "2023年10月26日" -->
            <span>{{stampToDate(item.CreatedTime, "2006年01月02日")}}</span>
            <!-- 显示为 "10-26" -->
            <span>{{stampToDate(item.CreatedTime, "01-02")}}</span>
            <!-- 显示为 "15:30:45" -->
            <span>{{stampToDate(item.CreatedTime, "15:04:05")}}</span>
            <!-- 显示为 "Oct 26, 2023" -->
            <span>{{stampToDate(item.CreatedTime, "Jan _2, 2006")}}</span>
        </p>
    </div>
    {% endfor %}
{% endarchiveList %}

在文章详情页,我们可能需要显示文章的详细发布和更新时间:

{% archiveDetail archive with name="Id" %} {# 假设这里获取了当前文章详情 #}
<article>
    <h1>{{archive.Title}}</h1>
    <p class="info">
        发布时间:<span>{{stampToDate(archive.CreatedTime, "2006-01-02 15:04:05")}}</span>
        更新时间:<span>{{stampToDate(archive.UpdatedTime, "2006年01月02日 星期一 下午03点04分")}}</span>
    </p>
    <div class="content">
        {{archive.Content|safe}}
    </div>
</article>

甚至在需要显示用户信息的场景,比如用户的上次登录时间:

{% userDetail userInfo with name="Id" id="1" %} {# 假设获取了ID为1的用户信息 #}
<div class="user-profile">
    <h2>{{userInfo.UserName}}</h2>
    <p>注册时间:<span>{{stampToDate(userInfo.CreatedTime, "2006年01月02日")}}</span></p>
    <p>上次登录:<span>{{stampToDate(userInfo.LastLogin, "2006/01/02 15:04")}}</span></p>
</div>

通过这些例子,我们可以看到stampToDate标签的强大之处,它让时间信息的展示变得异常灵活。

实用小贴士

  • 记住Go语言的参考日期: “2006年01月02日15时04分05秒”是理解所有时间格式的关键。你想要哪个部分,就用这个参考日期中对应的数字或文本来表示。
  • 时间戳的来源: AnqiCMS的文档模型(archive)、分类模型(category)、用户模型(user)等,通常都包含CreatedTimeUpdatedTime这类时间戳字段。在调用相应标签时,你可以很方便地获取到这些时间戳。
  • 确保是时间戳: stampToDate标签专门用于处理时间戳。如果你的数据字段本身已经是格式化的日期字符串(例如“2023-10-26”),那么就不需要使用stampToDate,可以直接输出。如果你不确定某个字段是否为时间戳,可以尝试使用{{ item.CreatedTime|dump }}来查看其类型和值,