在安企CMS的模板开发中,灵活地展示日期和时间是内容呈现不可或缺的一部分。您可能经常需要将系统或内容中的日期信息,按照特定的格式,比如“年-月-日”、“月/日 时:分”等方式呈现在用户面前。这时,date过滤器便成为了您的得力助手。
安企CMS作为一款基于Go语言构建的内容管理系统,在模板层面也自然地沿用了GoLang在处理日期时间上的一些约定。date过滤器正是专为处理GoLang原生time.Time类型数据而设计的。
认识date过滤器及其GoLang格式化规则
date过滤器的主要作用是将一个time.Time类型的值,按照您定义的格式字符串,转换为易于阅读的日期时间字符串。但这里有一个非常重要的细节需要注意:date过滤器只接受time.Time类型的数据作为输入。
而格式化字符串的写法,是GoLang特有的“2006-01-02 15:04:05”基准时间布局。这并非随意的一串数字,而是Go语言内部用于定义日期时间格式的参考时间点。这个基准时间中的每个数字和符号都代表着不同的日期时间元素:
2006:表示年份01:表示月份(带前导零)02:表示日期(带前导零)15:表示小时(24小时制,带前导零)04:表示分钟(带前导零)05:表示秒(带前导零)- 您可以根据需求,自由组合这些数字和符号,来创建任何您想要的日期时间格式。例如:
2006-01-02会输出年-月-日01/02会输出月/日15:04会输出时:分Mon, 02 Jan 2006 15:04:05 MST会输出星期一, 02 1月 2006 15:04:05 CST这样的完整格式
如何使用date过滤器
当您的模板变量直接持有GoLang的time.Time对象时,使用date过滤器非常直观。假设您在GoLang后端代码中定义了一个currentTime变量并将其设置为当前的time.Time对象传递给模板:
{# 假设 currentTime 是一个 GoLang 的 time.Time 对象 #}
{# 仅显示年份 #}
<div>当前年份:{{ currentTime|date:"2006" }}</div>
{# 显示年-月-日 #}
<div>完整日期:{{ currentTime|date:"2006-01-02" }}</div>
{# 显示月/日 时:分 #}
<div>简要时间:{{ currentTime|date:"01/02 15:04" }}</div>
{# 显示中文格式的日期时间 #}
<div>中文格式:{{ currentTime|date:"2006年01月02日 星期一 15时04分" }}</div>
关键点:time.Time与时间戳的区分
在安企CMS的模板开发中,您会经常遇到需要显示内容的发布时间 (CreatedTime) 或更新时间 (UpdatedTime)。这些字段在archiveDetail、archiveList或categoryDetail等标签中,通常是以时间戳的形式提供的,而非直接的time.Time类型。
如果直接将这些时间戳传递给date过滤器,模板引擎会因为类型不匹配而报错。针对这种情况,安企CMS提供了另一个专门用于格式化时间戳的便捷标签——stampToDate。
stampToDate标签的使用方式如下:
{# 假设 item.CreatedTime 是一个时间戳(例如:1675862400) #}
{# 格式化时间戳为“年-月-日” #}
<div>发布日期:{{ stampToDate(item.CreatedTime, "2006-01-02") }}</div>
{# 格式化时间戳为“年年年年/月月/日日 时:分:秒” #}
<div>更新时间:{{ stampToDate(item.UpdatedTime, "2006/01/02 15:04:05") }}</div>
{# 格式化为更友好的中文形式 #}
<div>内容创建于:{{ stampToDate(item.CreatedTime, "2006年01月02日 15点04分") }}</div>
通过上面的示例,您可以清晰地看到date过滤器和stampToDate标签各自适用的场景。正确区分这两种数据类型和相应的处理方法,能帮助您更高效地进行模板开发,避免不必要的错误。
总结
date过滤器是安企CMS模板中处理GoLang原生time.Time类型数据格式化的标准方式。它基于GoLang独特的基准时间布局进行格式定义,提供了极高的灵活性。同时,当您面对从数据库中获取的时间戳数据时,请记住使用stampToDate标签来完成格式化,以确保模板的正确运行和数据展示。掌握了这两个工具,您就能轻松应对各种日期时间显示需求。
常见问题 (FAQ)
1. 为什么我的CreatedTime字段直接用date过滤器会报错?
这通常是因为CreatedTime字段在安企CMS的内容标签(如archiveList、archiveDetail等)中,是以时间戳的形式返回的,而不是GoLang的time.Time对象。date过滤器要求输入必须是time.Time类型。对于时间戳,您应该使用stampToDate标签来进行格式化,例如:{{ stampToDate(item.CreatedTime, "2006-01-02") }}。
2. GoLang的时间格式化字符串为什么是’2006-01-02 15:04:05’?有其他记忆方法吗?
GoLang的日期时间格式化字符串是其创建者为了避免模糊性而设计的,每个数字和符号都代表一个特定的日期时间元素。记住它是“1月2日周一下午3点04分05秒MST 2006年”(Mon Jan 2 15:04:05 MST 2006),您可以把这串文字中的每个元素作为替换的模板。例如,想要年份就写“2006”,想要月份就写“01”,想要小时就写“15”。这有助于您快速构建所需的格式。
3. 我能在自定义的GoLang后端代码中创建time.Time对象并传给模板,然后使用date过滤器吗?
当然可以。如果您是进行二次开发,并且在您的GoLang后端逻辑中创建了time.Time类型的变量,您可以直接将其传递给安企CMS的模板。在模板中,这个变量就可以直接使用date过滤器进行格式化。这是date过滤器最典型的使用场景之一,它完美衔接了GoLang后端逻辑和前端模板的日期时间展示。