在网站文章详情页,我们经常希望文章的发布日期或更新日期能够整齐地展示出来,有时候还需要它们靠右对齐,并且占据一个固定的宽度,这样页面看起来既专业又美观。AnQiCMS 提供了灵活的模板标签和过滤器,帮助我们轻松实现这一需求。
理解安企CMS的日期处理方式
AnQiCMS 在处理日期和时间时,通常将其存储为时间戳(timestamp)的形式。这意味着在模板中直接调用 {{ archive.CreatedTime }} 得到的是一串数字,而不是我们习惯的 2023年01月01日 这样的格式。为了让这些时间戳变得可读,AnQiCMS 内置了一个非常实用的模板标签 stampToDate,它的作用就是将原始的时间戳转换成我们能看懂的日期和时间格式。
stampToDate 的使用方式是 {{ stampToDate(时间戳, "格式") }}。这里的“格式”是一个关键点,它遵循 Go 语言特有的时间格式化规则。与许多其他语言使用 Y-m-d H:i:s 这样的占位符不同,Go 语言使用一个固定的参考时间 2006-01-02 15:04:05 来作为格式的模板。例如,如果你想显示 年-月-日,那么格式字符串就写成 2006-01-02;如果想显示 年-月-日 时:分:秒,就写成 2006-01-02 15:04:05。
第一步:获取并格式化日期时间
首先,我们需要在文章详情页的模板中,通过 archiveDetail 标签获取文章的创建时间或更新时间。例如,要获取当前文章的创建时间并格式化成 年-月-日 时:分 的形式,我们可以这样操作:
{% archiveDetail archiveData with name="CreatedTime" %}
{% set formattedDate = stampToDate(archiveData, "2006-01-02 15:04") %}
这里,我们先用 archiveDetail 标签将当前文章的 CreatedTime(创建时间戳)赋值给一个临时变量 archiveData。然后,我们使用 stampToDate 标签将 archiveData 转换成 YYYY-MM-DD HH:MM 格式的字符串,并将结果存储在 formattedDate 这个变量中。现在,formattedDate 就包含了我们想要显示的日期时间字符串。
第二步:实现指定长度的右对齐
接下来,要让日期字符串“靠右对齐到指定长度”,我们并不仅仅是依靠 CSS 样式来控制整个元素的对齐方式,而是要对日期字符串本身进行处理,确保它在显示时始终占据一个固定的字符宽度,并且内容在右侧对齐,左侧用空格填充。
AnQiCMS 模板引擎提供了一系列字符串处理过滤器来帮助我们实现这一点,其中最适合实现右对齐和固定长度效果的就是 rjust(right justify,右对齐)过滤器。
rjust 过滤器的作用是在字符串的左侧填充空格,直到字符串达到我们指定的总长度。它的用法是 {{ 变量 | rjust:目标长度 }}。
例如,如果我们希望 formattedDate 变量中的日期字符串始终占据 20 个字符的宽度,不足的部分在左侧用空格填充,可以这样使用 rjust:20:
{% set alignedDate = formattedDate | rjust:20 %}
{{ alignedDate }}
现在,我们把格式化日期和右对齐的功能结合起来。首先使用 stampToDate 格式化时间戳,然后将这个结果通过管道符 | 传递给 rjust 过滤器。
{% archiveDetail archiveData with name="CreatedTime" %}
{% set formattedAndAlignedDate = stampToDate(archiveData, "2006-01-02 15:04") | rjust:20 %}
<span class="article-date">{{ formattedAndAlignedDate }}</span>
这样,无论实际的日期字符串有多长(只要不超过 20 个字符),它都会被填充到 20 个字符的长度,并靠右对齐。
结合 CSS 优化最终显示
虽然 rjust 过滤器确保了日期字符串本身的固定宽度和内容右对齐,但在实际的页面布局中,你可能还会希望整个日期显示区域在页面上位于右侧。这时,我们可以结合传统的 CSS 样式来控制其父级容器或 <span> 元素的浮动或文本对齐方式。
例如,在上面的代码基础上,我们可以给 <span> 标签添加一些样式:
<style>
.article-date {
float: right; /* 让日期元素浮动到右侧 */
display: block; /* 确保float生效,或者使用inline-block */
/* font-family: "Courier New", monospace; /* 可以选择等宽字体,让空格效果更明显 */ */
white-space: pre; /* 保留 `rjust` 填充的空格 */
}
/* 或者,如果父容器是flex或grid,可以直接用对齐属性 */
.article-info-container {
display: flex;
justify-content: flex-end; /* 在flex容器中将内容靠右对齐 */
}
</style>
<div class="article-info-container">
<span>发布人:AnQiCMS用户</span>
{% archiveDetail archiveData with name="CreatedTime" %}
{% set formattedAndAlignedDate = stampToDate(archiveData, "2006-01-02 15:04") | rjust:20 %}
<span class="article-date">{{ formattedAndAlignedDate }}</span>
</div>
请注意 white-space: pre; 这个 CSS 属性,它非常重要,因为它能确保浏览器正确显示 rjust 过滤器填充的空格,否则浏览器可能会自动折叠多个空格。
完整示例(代码片段)
下面是一个将发布日期和更新日期靠右对齐到指定长度的完整模板示例:
<style>
.article-meta {
overflow: hidden; /* 清除浮动 */
padding: 10px 0;
border-bottom: 1px solid #eee;
}
.article-meta span {
display: inline-block;
margin-right: 15px;
}
.article-meta .date-display {
float: right;
font-family: "Courier New", monospace; /* 使用等宽字体以确保对齐效果 */
white-space: pre; /* 保留 rjust 填充的空格 */
margin-right: 0; /* 右侧不需要外边距 */
}
</style>
<article>
<h1>{% archiveDetail with name="Title" %}</h1>
<div class="article-meta">
<span>发布者:AnQiCMS</span>
<span>阅读量:{% archiveDetail with name="Views" %}</span>
{% archiveDetail createdTimeData with name="CreatedTime" %}
{% set formattedCreatedDate = stampToDate(createdTimeData, "2006-01-02 15:04") %}
<span class="date-display">发布日期:{{ formattedCreatedDate | rjust:20 }}</span>
{% archiveDetail updatedTimeData with name="UpdatedTime" %}
{% set formattedUpdatedDate = stampToDate(updatedTimeData, "2006-01-02 15:04") %}
<span class="date-display">更新日期:{{ formattedUpdatedDate | rjust:20 }}</span>
</div>
<div class="article-content">
{% archiveDetail articleContent with name="Content" %}
{{articleContent|safe}}
</div>
</article>
通过以上步骤,你就可以在 AnQiCMS 的文章详情页中,优雅地控制日期时间戳的显示格式、固定长度和右对齐,从而提升网站内容的专业性和用户体验。
常见问题 (FAQ)
1. 为什么我的日期格式化后没有像预期那样对齐,或者没有显示指定的长度?
这通常有几个原因。首先,请检查 rjust 过滤器中设置的“目标长度”是否足够容纳你格式化后的日期字符串。如果目标长度太短,rjust 不会截断字符串。其次,确保在应用了 rjust 过滤器的 HTML 元素上,你已经添加了 white-space: pre; 或 white-space: pre-wrap; 等 CSS 属性,这样浏览器才不会折叠 rjust 填充的空格。此外,使用等宽字体(如 monospace 字体系列)可以帮助在视觉上实现更精确的字符对齐。
2. stampToDate 中的 2006-01-02 15:04:05 是什么意思?我如何显示星期几或中文日期?
`2006-01-02 15:04