在网站内容管理中,时间的呈现方式对用户体验至关重要。虽然系统在后台处理数据时可能偏爱统一且高效的Unix时间戳格式,但对于访客来说,一串无规律的数字显然不如“2023年10月27日 14:35”这样直观易懂。安企CMS深知这一点,并提供了简便而强大的工具来解决这个问题。

Unix时间戳:数据库中的“时间语言”

Unix时间戳,简而言之,就是从1970年1月1日零时(UTC/GMT)开始所经过的秒数。它是一种全球统一、不随地区和时区变化的时间表示方式,非常适合数据库存储、数据传输和编程计算。在安企CMS中,文章的发布时间(CreatedTime)、更新时间(UpdatedTime),甚至用户的登录记录或VIP到期时间,通常都以这种数字形式存储。

然而,当这些时间戳直接呈现在网站前台时,它们只会是一串数字,例如1678886400。这样的显示对于普通用户来说毫无意义,无法从中获取任何日期或时间信息。

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

为了让这些数字“开口说话”,安企CMS提供了一个名为 stampToDate 的模板标签,它能够轻松地将Unix时间戳转换为任何您需要的可读日期和时间格式。

这个标签的基本使用方法非常直观: {{stampToDate(时间戳, "格式")}}

在这里:

  • 时间戳:是您想要转换的Unix时间戳,通常是10位数字。在安企CMS的模板中,这通常会是item.CreatedTimearchive.UpdatedTime等变量。
  • 格式:这是一个字符串,定义了您希望日期和时间显示成什么样子。

理解Go语言的时间格式化规则

stampToDate 标签的核心在于其第二个参数——日期时间格式字符串。安企CMS基于Go语言开发,因此它的时间格式化遵循Go语言特有的规则,而不是常见的Y-m-d H:i:syyyy-MM-dd HH:mm:ss

Go语言采用一个固定的参考时间 2006-01-02 15:04:05 作为格式化的模板。您只需要将这个参考时间中的年、月、日、时、分、秒等元素替换为您想要的显示样式即可。

例如:

  • 如果您想显示 年-月-日,那么格式字符串就是 "2006-01-02"
  • 如果您想显示 年/月/日,那么格式字符串就是 "2006/01/02"
  • 如果您想显示 年 月 日 (中文),那么格式字符串就是 "2006年01月02日"
  • 如果您想显示 时:分:秒,那么格式字符串就是 "15:04:05"
  • 如果您想显示 年-月-日 时:分,那么格式字符串就是 "2006-01-02 15:04"

您还可以组合这些元素,甚至添加其他字符,比如星期几或AM/PM等,Go语言会智能地解析并按您定义的模板输出。

实际应用示例:在模板中格式化文档发布时间

假设您正在构建一个文章列表页面,并希望以“年-月-日 时:分”的格式显示文章的发布时间。在安企CMS的模板中,这通常会涉及到archiveListarchiveDetail标签。

一个常见的应用场景是显示文章的发布时间:

{# 在一个文章列表循环中 #}
{% 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日 15:04")}}</span>
                <span>更新于:{{stampToDate(item.UpdatedTime, "2006-01-02 15:04:05")}}</span>
            </div>
        </a>
    </li>
    {% endfor %}
{% endarchiveList %}

在上面的代码中,item.CreatedTimeitem.UpdatedTime 就是从数据库中取出的Unix时间戳。通过 stampToDate 标签,它们被转换为用户友好的日期和时间字符串。例如,如果 item.CreatedTime1678886400,格式化后可能显示为 “2023年03月15日 00:00”。

您也可以在文档详情页中直接格式化当前文档的时间:

{# 在文档详情页中 #}
<div>
    <h1>{% archiveDetail with name="Title" %}</h1>
    <p>发布时间:{% archiveDetail archiveCreatedTime with name="CreatedTime" %}{{stampToDate(archiveCreatedTime, "2006年1月2日 下午3点04分")}}</p>
    <p>最近更新:{% archiveDetail archiveUpdatedTime with name="UpdatedTime" %}{{stampToDate(archiveUpdatedTime, "2006-01-02 15:04:05")}}</p>
</div>

这里展示了两种不同的自定义格式,您可以根据页面设计和用户习惯灵活选择。

更多格式化场景

除了文章的发布和更新时间,安企CMS中还有许多其他场景会涉及到时间戳,例如用户的注册时间、最后登录时间、VIP会员的到期时间等。只要您能获取到这些时间戳变量,就可以使用 stampToDate 标签进行格式化。

例如,显示用户的最后登录时间:

{# 假设 userDetail 标签可以获取到用户详情 #}
{% userDetail lastLogin with name="LastLogin" id="1" %}
<p>最后登录时间:{{stampToDate(lastLogin, "2006/01/02 15:04")}}</p>

总结

通过 stampToDate 标签和灵活的Go语言时间格式化规则,安企CMS为网站运营者提供了强大且易用的时间显示控制能力。无论是列表页、详情页还是其他需要展示时间信息的模块,您都可以根据实际需求,将冰冷的Unix时间戳转换为清晰、友好的日期时间字符串,从而大大提升网站的专业性和用户体验。


常见问题 (FAQ)

1. 我提供的Unix时间戳是13位数字,stampToDate 标签能处理吗? 目前 stampToDate 标签设计为处理标准的10位Unix时间戳(秒级)。如果您的时间戳是13位(毫秒级),您需要在传入之前自行将其除以1000,转换为10位秒级时间戳。例如:{{stampToDate(item.CreatedTime / 1000, "2006-01-02")}}

2. 安企CMS中是否还有其他格式化日期和时间的标签或过滤器? 安企CMS的模板引擎也支持一个名为 date 的过滤器,但它要求传入的值已经是Go语言中的 time.Time 类型,而不是原始的Unix时间戳。对于从数据库直接取出的Unix时间戳,stampToDate 标签是更直接和推荐的格式化方式。date 过滤器更适用于经过Go后端处理后已转换为 time.Time 对象的变量。

3. 为什么Go语言的时间格式化要用 2006-01-02 15:04:05 这样的数字作为参考?这有什么特殊含义吗? 这是Go语言设计上的一个独特之处,它没有像其他语言那样使用占位符(如Y代表年份,m代表月份),而是选择了一个具体的日期和时间作为格式化模板。这个日期 2006年1月2日 下午3点4分5秒 只是Go语言官方文档中用于展示所有时间元素的一个“参考点”,每个数字和位置都代表了对应的日期时间组件。例如,2006代表四位年份,01代表两位月份,02代表两位日期,15代表24小时制的小时数,以此类推。您只需记住这个特殊的日期时间字符串,并根据需要替换其中的数字即可定义输出格式。