除了`stampToDate`,安企CMS的`date`过滤器在处理`time.Time`类型时,如何实现自定义日期时间格式化?

📅 👁️ 73

在安企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日” }}

    更新于:{{

相关文章

安企CMS模板如何利用`divisibleby`过滤器,在循环中实现隔行变色或按N个元素分组输出?

在网站运营中,精心设计的页面布局和内容展示,能够显著提升用户体验和内容的可读性。尤其在列表内容较多的场景下,如果所有条目都以相同样式呈现,容易造成视觉疲劳。这时候,隔行变色或按特定数量分组输出,就能很好地解决这些问题。安企CMS(AnQiCMS)的模板引擎,凭借其灵活的Django模板语法,提供了强大的过滤器功能,其中`divisibleby`过滤器便是实现这类需求的一个利器

2025-11-08

`length_is`过滤器在安企CMS模板中如何用于验证用户输入或数据列表的长度,并返回布尔值进行条件渲染?

在安企CMS的模板开发中,灵活地控制内容的显示方式是提升网站用户体验的关键。其中,`length_is` 过滤器便是一个非常实用的工具,它能帮助我们在模板中轻松地对用户输入或数据列表的长度进行校验,并根据校验结果进行有条件的渲染。 `length_is` 过滤器的核心作用是判断一个变量(无论是字符串、数组还是映射)的长度是否与我们预设的某个值相等。它并不会直接返回具体的长度数值

2025-11-08

`length`过滤器在计算安企CMS模板中中文字符串长度时,是按字节还是按字符计数?如何影响输出?

在安企CMS的模板开发中,处理字符串长度是一个常见的需求。当内容涉及到多语言,特别是包含中文字符时,一个字符串的长度究竟是按照字节(byte)还是字符(character)来计算,会直接影响模板输出的准确性和内容的呈现效果。 安企CMS模板使用的`length`过滤器,正是为了解决这一问题而设计的。它在计算字符串长度时,是**按照字符而非字节进行计数的**。这意味着,无论是英文字母

2025-11-08

如何使用`get_digit`过滤器从长数字ID中提取特定位数,并在安企CMS模板中进行显示或逻辑判断?

在安企CMS模板开发中,我们有时会遇到需要从一串长数字ID中提取特定位数的情况。例如,您可能希望根据ID的某个数字来为内容分配不同的样式,或者进行一些逻辑上的判断。这时候,`get_digit` 过滤器就能派上用场了。它提供了一种简洁高效的方式来实现这一目标,让您的模板逻辑更加灵活。 ### 理解 `get_digit` 过滤器 `get_digit`

2025-11-08

`stampToDate`过滤器在安企CMS中,如何将Unix时间戳格式化为“YYYY年MM月DD日 HH:MM”等多种本地化日期字符串?

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

2025-11-08

如何在安企CMS模板中安全地使用`truncatechars_html`过滤器,截取HTML富文本内容并自动闭合标签?

在网站内容运营中,我们经常需要在列表页、摘要区域或特定版块显示文章、产品或单页面的部分内容。这些内容往往是包含 HTML 标签的富文本,如果简单地按字符数进行截取,很可能会导致 HTML 标签被截断,从而破坏页面的布局和显示效果。例如,一个 `<p>这是一个段落<strong id="test">中的加粗</str...</p>` 这样的内容如果被粗暴截断,可能会导致页面出现未闭合的

2025-11-08

`truncatewords`和`truncatechars`过滤器在截取安企CMS文章摘要时,对中英文字符和单词的截断逻辑有何不同?

在安企CMS中,为了在列表页或预览区域展示文章摘要,我们常常需要对文章内容进行截取。这时,`truncatewords` 和 `truncatechars` 这两个过滤器就派上了用场。它们都能帮助我们将冗长的内容精简,但两者在截取逻辑上有着显著的区别,尤其是在处理中英文字符和单词时,其表现更是大相径庭。理解这些差异,能帮助我们更好地控制摘要的呈现效果。 ## `truncatechars`

2025-11-08

如何利用`upper`、`lower`、`capfirst`和`title`过滤器,统一安企CMS前端页面的英文标题大小写格式?

在网站运营中,内容展示的专业度和一致性对于提升用户体验和品牌形象至关重要。尤其是在处理英文标题时,统一的大小写格式不仅让页面看起来更整洁,也间接影响着内容的可读性。安企CMS(AnQiCMS)凭借其基于Django模板引擎的强大功能,提供了几个非常实用的过滤器,可以帮助我们轻松实现前端页面英文标题的大小写格式化。 这些过滤器包括 `upper`、`lower`、`capfirst` 和

2025-11-08