在安企CMS的模板世界里,我们经常需要将时间戳(timestamp)转化为可读的日期和时间字符串。stampToDate这个标签函数无疑是我们实现这一目标的好帮手。它能够根据我们定义的Go语言日期格式,将一个10位的时间戳优雅地呈现出来,比如“2023年06月07日 15:30:00”。

然而,网站运营的实际需求总是千变万化。有时候,我们不仅仅满足于基础的日期格式化,可能还需要对这个已经格式化好的日期字符串进行进一步的处理,例如截取其中的一部分,或者根据特定场景进行更细致的调整。比如,我们可能只想显示日期的月份和日期(“06月07日”),或者只想显示时间(“15:30”),甚至需要将长格式的日期字符串截短以适应有限的显示空间。

这时,AnQiCMS模板引擎提供的“过滤器”(filters)就派上用场了。

stampToDate:日期的初次格式化

首先,我们来回顾一下stampToDate的基本用法。它接受两个参数:一个10位的时间戳和表示Go语言日期格式的字符串。例如,如果我们要显示文章的创建时间,并将其格式化为“年-月-日 时:分:秒”的形式,代码会是这样:

{{ stampToDate(item.CreatedTime, "2006-01-02 15:04:05") }}

假设item.CreatedTime的值是1678886400(对应2023年3月15日 00:00:00),那么上述代码的输出将是:“2023-03-15 00:00:00”。

过滤器:对格式化日期字符串的再加工

现在,我们有了一个格式化好的日期字符串,但我们的目标是进一步处理它。AnQiCMS的模板过滤器就像管道一样,可以将一个变量(或一个函数的结果)通过一系列处理步骤,最终得到我们想要的数据。过滤器的基本语法是{{ 变量 | 过滤器名称:参数 }}

针对日期字符串的截取,我们有几个非常实用的过滤器可以选择,其中slicetruncatechars是两个最常用的。

使用 slice 过滤器精确截取字符串

slice过滤器允许我们像操作数组一样,根据起始和结束索引来截取字符串的子串。这对于从格式化好的日期字符串中提取特定部分非常有效。它的参数格式为"start:end",其中start是起始索引(包含),end是结束索引(不包含)。如果省略start,则从字符串开头截取;如果省略end,则截取到字符串末尾。

示例一:只显示月份和日期

假设我们已经通过stampToDate得到了“2023-03-15”这个字符串,现在我们只想显示“03-15”。 我们可以先将日期格式化为“年-月-日”,然后使用slice从第5个字符(索引为4,因为索引从0开始)开始截取到字符串末尾:

{# 假设item.CreatedTime的时间戳对应2023-03-15 #}
{% set formattedDate = stampToDate(item.CreatedTime, "2006-01-02") %}
{# formattedDate 现在是 "2023-03-15" #}
{{ formattedDate | slice:"5:" }}

这段代码的输出将是:“03-15”。这里的"5:"表示从字符串的第5个字符(索引为4)开始截取到字符串的末尾。

示例二:只显示时间(时:分)

如果我们需要从“2023-03-15 10:30:45”中提取“10:30”,我们可以这样操作:

{# 假设item.CreatedTime的时间戳对应2023-03-15 10:30:45 #}
{% set formattedDateTime = stampToDate(item.CreatedTime, "2006-01-02 15:04:05") %}
{# formattedDateTime 现在是 "2023-03-15 10:30:45" #}
{{ formattedDateTime | slice:"11:16" }}

输出会是:“10:30”。这里的"11:16"表示从第12个字符(索引为11)开始,截取到第16个字符(索引为15)为止。

使用 truncatechars 过滤器按字符数截短

truncatechars过滤器则更侧重于将字符串截短到指定的字符数量,并在末尾自动添加省略号(“…”)。这在显示空间有限,但又不想完全丢失信息的情况下非常有用。

示例:将长格式日期截短显示

如果我们有一个格式非常长的日期字符串,比如“2023年03月15日 星期三 10时30分45秒”,但希望在前端只显示前10个字符,后面用省略号表示,就可以使用truncatechars

{# 假设item.CreatedTime的时间戳对应2023年03月15日 星期三 10时30分45秒 #}
{% set longDateString = stampToDate(item.CreatedTime, "2006年01月02日 星期三 15时04分05秒") %}
{# longDateString 现在可能是 "2023年03月15日 星期三 10时30分45秒" #}
{{ longDateString | truncatechars:10 }}

输出将是:“2023年03月…” (注意,truncatechars会将省略号也计算在总长度内)。

结合 {% set %} 标签提升可读性

当我们需要进行多步处理,或者希望代码更加清晰时,可以使用{% set %}标签来定义一个临时变量。这有助于将复杂的处理过程分解为更易读的小步骤。

”`twig {% set rawTimestamp = item.CreatedTime %} {# 第一步:格式化为完整的日期时间字符串 #} {% set fullDateTime = stampToDate(rawTimestamp, “2006年01月02日 15时04分”) %}

{# 第二步:从完整日期时间中提取日期部分 #} {% set datePart = fullDateTime | slice:“0:11” %} {# 假设需要 “YYYY年MM月DD日” #}

{# 第三步:进一步处理日期部分,例如截短或替换 #} {% set displayDate = datePart | replace:“年”,”