在安企CMS的模板开发中,我们经常需要将数据库中存储的时间值,比如文章的发布时间、更新时间,以我们期望的日期和时间格式展示出来。stampToDate过滤器无疑是其中最常用且功能强大的工具,它能将Unix时间戳灵活地转换为各种日期格式。但除了这个‘万金油’,安企CMS还提供了其他几种同样高效、实用的时间格式化方法,它们在不同场景下各有所长,能够帮助我们更精细、更便捷地处理时间数据的展示。
stampToDate:时间戳转换的基础与万能之选
首先,让我们再次确认stampToDate的功能,因为它是处理数据库中常见10位Unix时间戳的核心工具。无论你在archiveList、archiveDetail或commentList等标签中获取到CreatedTime或UpdatedTime这类时间戳字段,stampToDate都能将其转化为易读的日期时间格式。
它的使用方式非常直观,接受两个参数:需要格式化的时间戳值,以及一个定义输出格式的字符串。
{# 假设 publishStamp 是一个10位的时间戳,例如 1609470335 #}
{% set publishStamp = 1609470335 %}
{# 格式化为 2021年06月30日 #}
<div>发布日期:{{stampToDate(publishStamp, "2006年01月02日")}}</div>
{# 格式化为 2021-06-30 15:04:05 #}
<div>发布时间:{{stampToDate(publishStamp, "2006-01-02 15:04:05")}}</div>
这个过滤器是处理数据库返回时间戳时的首选,其灵活性在于可以自定义输出的任何格式。
标签内直接定义格式:快捷与便利的选择
对于像文章发布时间(CreatedTime)和更新时间(UpdatedTime)这类在archiveDetail或archiveList标签中经常需要显示的时间字段,安企CMS提供了一种更便捷的格式化方式:直接在标签内部通过format参数来指定。
这种方法省去了额外调用stampToDate的步骤,让模板代码更加简洁易读。
{# 在文档详情页,直接获取并格式化文章创建时间 #}
<div>
文章发布于:{% archiveDetail with name="CreatedTime" format="2006年01月02日 15:04" %}
</div>
{# 在文档列表中,同样可以为每个文章项格式化时间 #}
{% archiveList archives with type="list" limit="5" %}
{% for item in archives %}
<div>
{{item.Title}} - 发布于:{{item.CreatedTime|format("2006-01-02")}}
</div>
{% endfor %}
{% endarchiveList %}
可以看到,当你在archiveList或archiveDetail中直接访问item.CreatedTime或item.UpdatedTime时,如果配合format过滤器,它会自动进行格式化,效果与stampToDate相同。这在很多场景下都能提升开发效率。
{% now %} 标签:获取当前时间的利器
有时,我们需要的不是数据库中的某个时间,而是显示网页渲染时的服务器当前时间,例如在页脚显示当前的年份或精确到秒的时间。这时,{% now %}标签就派上用场了。
它不依赖任何外部变量,只负责获取并格式化服务器的实时时间。
{# 在页脚显示当前年份 #}
<div>© {% now "2006" %} All Rights Reserved.</div>
{# 显示完整的当前日期和时间 #}
<div>当前服务器时间:{% now "2006-01-02 15:04:05" %}</div>
这个标签对于需要动态展示当前时间的场景非常实用。
|date (或 |time) 过滤器:针对特定数据类型
除了上述几种方式,安企CMS还提供了|date(或其别名|time)过滤器。这个过滤器与stampToDate略有不同,它要求被过滤的对象本身就是一个Go语言的time.Time类型对象,而不是一个纯粹的Unix时间戳。
如果你在模板中操作的是一个已经解析为Go语言time.Time类型的变量(例如,某些自定义的Go结构体或通过其他方式转换后的时间对象),那么|date过滤器就非常适用。
{# 假设 myGoTimeVar 是一个已知的Go time.Time类型变量 #}
<div>自定义时间:{{ myGoTimeVar|date:"2006年01月02日 星期一" }}</div>
{# myGoTimeVar|time 和 myGoTimeVar|date 效果一致 #}
<div>自定义时间:{{ myGoTimeVar|time:"2006/01/02 15:04" }}</div>
虽然在大多数直接从数据库获取时间戳的场景中,stampToDate更常用,但了解|date和|time的存在,可以帮助你在处理预先处理过的Go时间对象时,选择更精准的工具。
格式化字符串的奥秘:Go语言的时间布局
不论是stampToDate过滤器、标签内format参数,还是{% now %}标签和|date过滤器,它们都遵循同一个时间格式化规则:Go语言的参考时间布局。
Go语言没有像PHP那样使用”Y-m-d”或Java那样使用”yyyy-MM-dd”的格式符,而是使用一个特定的参考日期2006-01-02 15:04:05.999999999 -0700 MST(通常简写为2006-01-02 15:04:05)来作为格式化的模板。
这意味着,你需要根据你想要显示的日期/时间部分,在格式字符串中对应地写出参考日期/时间中的相应部分:
- 年份:
2006 - 月份:
01(带前导零),1(不带前导零),Jan(缩写),January(完整) - 日期:
02(带