在网站内容管理中,日期和时间信息的展示无处不在。无论是文章的发布时间、产品的上架日期,还是评论的提交时刻,一个清晰、易读的日期格式对于提升用户体验至关重要。安企CMS(AnQiCMS)深知这一需求,提供了强大的模板标签和过滤器,其中stampToDate过滤器便是将原始Unix时间戳转化为我们熟悉的本地化日期字符串的利器。

本文将深入探讨stampToDate过滤器的用法,帮助您在安企CMS模板中轻松实现各种日期时间格式的自定义显示。

理解安企CMS中的Unix时间戳

在安企CMS中,许多存储在数据库中的日期和时间信息,如文档的创建时间CreatedTime或更新时间UpdatedTime,通常以Unix时间戳的形式存在。Unix时间戳是一个整数,代表从UTC时间1970年1月1日0时0分0秒(又称Unix纪元)起经过的秒数。

直接在模板中显示这样的时间戳,例如1609470335,对普通用户来说是难以理解的。为了提供更好的阅读体验,我们需要将其格式化为“2021年01月01日 12:25”这样的本地化字符串。

核心工具:stampToDate过滤器

安企CMS模板引擎借鉴了Django的语法,并提供了stampToDate这一便捷的过滤器,专门用于将Unix时间戳格式化为可读的日期时间字符串。

基本语法:

{{ stampToDate(时间戳, "格式") }}

其中:

  • 时间戳:通常是您从数据对象(如item.CreatedTime)中获取的10位Unix时间戳。
  • "格式":这是一个字符串,定义了您希望日期时间显示成的具体格式。需要特别注意的是,这个“格式”并非我们常见的Y-m-d H:i:s这类模式,而是采用了Go语言独特的“参考时间”机制。

掌握GoLang时间格式的秘诀

Go语言在定义时间格式时,使用一个固定的参考时间点来表示各时间单位。这个参考时间就是:2006年01月02日 15点04分05秒

这意味着,当你希望显示年份时,就使用2006;希望显示月份时,就使用01(代表一月);希望显示日期时,就使用02(代表二号),以此类推。以下是常用的对应关系:

  • 2006 -> 年 (YYYY)
  • 011 -> 月 (MM/M)
  • 022 -> 日 (DD/D)
  • 153 -> 小时 (24小时制 HH/H) 或 (12小时制 hh/h)
  • 04 -> 分钟 (MM)
  • 05 -> 秒 (SS)
  • Mon -> 星期几 (如:Mon, Tue, Wed)
  • Monday -> 完整的星期几 (如:Monday, Tuesday)
  • Jan -> 英文月份缩写 (如:Jan, Feb)
  • January -> 完整的英文月份 (如:January, February)

通过组合这些参考时间元素,您几乎可以定义出任何想要的日期时间格式。

常用格式化示例与应用

假设我们有一个Unix时间戳1672502400,它对应的是2023年01月01日 00:00:00。我们来看看如何用stampToDate过滤器将其格式化成多种常见的本地化字符串。

  1. “YYYY年MM月DD日 HH:MM” (如:2023年01月01日 00:00)

    {{ stampToDate(1672502400, "2006年01月02日 15:04") }}
    

    输出:2023年01月01日 00:00

  2. “YYYY-MM-DD” (如:2023-01-01)

    {{ stampToDate(1672502400, "2006-01-02") }}
    

    输出:2023-01-01

  3. “MM/DD HH:MM” (如:01/01 00:00)

    {{ stampToDate(1672502400, "01/02 15:04") }}
    

    输出:01/01 00:00

  4. “HH:MM:SS” (如:00:00:00)

    {{ stampToDate(1672502400, "15:04:05") }}
    

    输出:00:00:00

  5. “YYYY/MM/DD 星期几” (如:2023/01/01 星期日)

    {{ stampToDate(1672502400, "2006/01/02 星期Monday") }}
    

    输出:2023/01/01 星期Sunday (注意Go语言的Monday对应输出完整的星期几,这里会是Sunday,因为1672502400是周日)

实际应用场景举例

在安企CMS的模板设计中,stampToDate过滤器常用于archiveList(文档列表)、archiveDetail(文档详情)和commentList(评论列表)等标签中。

例如,在一个文档列表中显示每篇文章的发布时间:

{% archiveList archives with type="page" limit="10" %}
    {% for item in archives %}
    <div class="article-item">
        <h3><a href="{{ item.Link }}">{{ item.Title }}</a></h3>
        <p>发布时间:
            <time datetime="{{ stampToDate(item.CreatedTime, "2006-01-02T15:04:05") }}">
                {{ stampToDate(item.CreatedTime, "2006年01月02日 15:04") }}
            </time>
        </p>
        <p>{{ item.Description }}</p>
    </div>
    {% empty %}
    <p>暂时没有文章。</p>
    {% endfor %}
{% endarchiveList %}

在这个例子中,item.CreatedTime获取到的是Unix时间戳,通过stampToDate过滤器,我们将其格式化成了用户友好的“年-月-日 时:分”形式,同时也在<time>标签的datetime属性中输出了机器可读的ISO 8601格式,兼顾了用户体验和SEO。