在安企CMS中,日期和时间的展示常常需要根据网站的实际需求进行灵活的调整。我们都知道,stampToDate 过滤器对于处理Unix时间戳非常方便,它能将一串数字时间戳轻松转换成我们需要的日期格式。但有时,我们在模板中处理的日期值可能已经是一个Go语言的 time.Time 类型对象,而不是原始的时间戳。在这种情况下,安企CMS提供了另一个强大的工具,那就是 date 过滤器(或者它的别名 time 过滤器),它能直接对 time.Time 对象进行自定义格式化,提供更加精细的控制。
理解 time.Time 对象在模板中的来源
在使用 date 过滤器之前,我们首先要明确哪些数据在模板中是以 time.Time 对象的形式存在的。通常,我们会从以下几个地方获取到这类日期时间对象:
- 系统内置标签返回的日期时间字段: 比如,在
archiveDetail标签中获取的文档添加时间CreatedTime或更新时间UpdatedTime,虽然文档中提到它们是“时间戳”,但在一些特定场景或经过内部处理后,如果它们是以time.Time对象的形式传递到模板变量中,就可以直接使用date过滤器。 now标签获取的当前时间:{% now "2006-01-02 15:04" %}这样的标签,实际上是生成了一个格式化后的字符串。但如果我们想获取一个可进一步处理的time.Time对象,通常会在后端控制器中将当前时间以time.Time类型传递给模板,或者通过一些辅助函数(如果系统提供)将时间直接作为time.Time对象提供。- 通过
set标签赋值的time.Time变量: 如果你在模板的上下文(context)中通过set标签赋值了一个time.Time类型的变量,那么它也可以直接被date过滤器处理。
需要特别注意的是,date 过滤器对输入类型有严格要求,它必须接收一个 time.Time 对象。如果传入的是一个普通的10位或13位Unix时间戳(例如 1678886400),date 过滤器会因为类型不匹配而报错。这时,就应该使用 stampToDate 过滤器。
date 过滤器:基于Go语言布局的自由格式化
date 过滤器的使用方式非常直观,它与 stampToDate 最大的区别在于,它不需要先将时间戳转换为 time.Time 对象,因为它的输入本身就是 time.Time。它的语法是 {{ 变量名 | date:"格式字符串" }}。
这里的“格式字符串”是Go语言特有的日期时间布局,它不是像PHP或JavaScript那样使用 Y-m-d H:i:s 这样的占位符,而是使用一个固定的“魔法数字”——2006-01-02 15:04:05.999999999 -0700 MST 作为参考模板。你需要用这个参考模板中的对应数字来替换成你想要的格式。
让我们通过一些例子来深入理解:
假设我们有一个 time.Time 类型的变量 myTime,它的值为 2023年3月15日 下午3点04分05秒。
显示年份-月份-日期: 如果你想显示
2023-03-15,格式字符串就应该是"2006-01-02"。{{ myTime | date:"2006-01-02" }} {# 输出: 2023-03-15 #}显示日期/月份/年份: 如果你想显示
15/03/2023,格式字符串就应该是"02/01/2006"。{{ myTime | date:"02/01/2006" }} {# 输出: 15/03/2023 #}显示时间(小时:分钟): 如果你想显示
15:04,格式字符串就应该是"15:04"。{{ myTime | date:"15:04" }} {# 输出: 15:04 #}显示完整日期和时间: 如果你想显示
2023年03月15日 15时04分05秒,格式字符串就应该是"2006年01月02日 15时04分05秒"。Go语言的日期格式化允许你在数字之间插入任何你想要的文字,例如“年”、“月”、“日”、“时”、“分”、“秒”。{{ myTime | date:"2006年01月02日 15时04分05秒" }} {# 输出: 2023年03月15日 15时04分05秒 #}显示星期几和月份名称: Go语言的布局也支持显示星期几(Mon、Monday)和月份的名称(Jan、January)。
{{ myTime | date:"Mon, January 2, 2006" }} {# 输出: Wed, March 15, 2023 #}这里
Mon对应星期三(Wednesday),January对应三月(March)。
通过这些例子,你会发现,Go语言的日期格式化虽然初看有点独特,但一旦掌握了“魔法数字”的对应关系,它就能提供极高的灵活性,让你能够按照几乎任何你能想象到的格式来展示日期和时间。
实际应用中的一些小提示
在实际的内容运营和模板开发中,我们可能会这样使用 date 过滤器:
- 格式化文章的发布时间:
“`twig
{# 假设 archive.CreatedTime 已经是 time.Time 对象 #}
发布于:{{ archive.CreatedTime | date:“2006年01月02日” }}
更新于:{{