在安企CMS中,日期和时间的展示常常需要根据网站的实际需求进行灵活的调整。我们都知道,stampToDate 过滤器对于处理Unix时间戳非常方便,它能将一串数字时间戳轻松转换成我们需要的日期格式。但有时,我们在模板中处理的日期值可能已经是一个Go语言的 time.Time 类型对象,而不是原始的时间戳。在这种情况下,安企CMS提供了另一个强大的工具,那就是 date 过滤器(或者它的别名 time 过滤器),它能直接对 time.Time 对象进行自定义格式化,提供更加精细的控制。

理解 time.Time 对象在模板中的来源

在使用 date 过滤器之前,我们首先要明确哪些数据在模板中是以 time.Time 对象的形式存在的。通常,我们会从以下几个地方获取到这类日期时间对象:

  1. 系统内置标签返回的日期时间字段: 比如,在 archiveDetail 标签中获取的文档添加时间 CreatedTime 或更新时间 UpdatedTime,虽然文档中提到它们是“时间戳”,但在一些特定场景或经过内部处理后,如果它们是以 time.Time 对象的形式传递到模板变量中,就可以直接使用 date 过滤器。
  2. now 标签获取的当前时间: {% now "2006-01-02 15:04" %} 这样的标签,实际上是生成了一个格式化后的字符串。但如果我们想获取一个可进一步处理的 time.Time 对象,通常会在后端控制器中将当前时间以 time.Time 类型传递给模板,或者通过一些辅助函数(如果系统提供)将时间直接作为 time.Time 对象提供。
  3. 通过 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日” }}

    更新于:{{