在网站内容的展示中,如何将后台存储的时间戳数据,以用户友好且易于阅读的日期或时间形式呈现,是提升用户体验的关键一环。安企CMS深谙此道,为模板开发者提供了一个简洁高效的标签——stampToDate,让这一过程变得轻而易举。

理解安企CMS中的时间戳

在安企CMS的许多内容模型中,如文章、产品或分类等,时间数据通常以10位的时间戳形式存储。例如,文章的创建时间(CreatedTime)和更新时间(UpdatedTime)就是这样的时间戳。这种格式虽然便于数据库存储和计算,但直接显示给用户则显得生硬且难以理解。我们需要将其转换为常见的“年-月-日 时:分:秒”等形式。

核心利器:stampToDate 标签解析

安企CMS的模板引擎支持类似Django的语法,其中stampToDate标签正是为了解决时间戳格式化问题而设计的。它的使用方式非常直观:

{{stampToDate(时间戳字段, "格式化字符串")}}

这里有两个关键部分:

  1. 时间戳字段:这通常是你从archiveitem等对象中获取到的10位时间戳数据,例如item.CreatedTime
  2. 格式化字符串:这是决定时间日期显示样式的核心。安企CMS的模板引擎采用了Go语言(GoLang)的时间格式化标准。

Go语言时间格式化规则

Go语言的时间格式化规则与PHP、Python等语言中常见的Y-m-d H:i:s之类的占位符有所不同。它使用一个固定的参考时间来定义格式,这个参考时间是:

2006年01月02日 15时04分05秒 -0700 MST

你需要将这个参考时间中的各个部分,替换成你希望显示的实际日期时间元素。举例来说:

  • 2006 代表年份(四位数)
  • 01 代表月份(两位数)
  • 02 代表日期(两位数)
  • 15 代表小时(24小时制,两位数)
  • 04 代表分钟(两位数)
  • 05 代表秒数(两位数)
  • 如果你想显示12小时制的小时,可以使用03
  • 如果你想显示星期几,可以使用Mon(简写)或Monday(全称)。

理解这个参考时间是掌握Go语言时间格式化的关键。

常用格式化示例

掌握了Go语言的格式化规则后,我们可以轻松地实现各种常见的日期时间显示需求:

  • 仅显示年-月-日

    <div>{{stampToDate(item.CreatedTime, "2006-01-02")}}</div>
    {# 例如:2023-10-27 #}
    
  • 显示中文格式的年-月-日

    <div>{{stampToDate(item.CreatedTime, "2006年01月02日")}}</div>
    {# 例如:2023年10月27日 #}
    
  • 显示完整日期和时间(24小时制)

    <div>{{stampToDate(item.CreatedTime, "2006-01-02 15:04:05")}}</div>
    {# 例如:2023-10-27 10:30:45 #}
    
  • 显示完整日期和时间(12小时制,带上下午)

    <div>{{stampToDate(item.CreatedTime, "2006-01-02 03:04:05 PM")}}</div>
    {# 例如:2023-10-27 10:30:45 AM #}
    
  • 仅显示时:分

    <div>{{stampToDate(item.CreatedTime, "15:04")}}</div>
    {# 例如:10:30 #}
    
  • 显示周几

    <div>{{stampToDate(item.CreatedTime, "Mon")}}</div> {# 星期五 #}
    <div>{{stampToDate(item.CreatedTime, "Monday")}}</div> {# 星期五 #}
    

在模板中的实际运用

通常,你会在遍历文档列表或显示文档详情时使用stampToDate标签。例如,在展示文章列表时,你可能需要显示每篇文章的发布日期:

{% archiveList archives with type="page" limit="10" %}
    {% for item in archives %}
    <li>
        <a href="{{item.Link}}">
            <h5>{{item.Title}}</h5>
            <div>
                <span>发布日期:{{stampToDate(item.CreatedTime, "2006年01月02日 15:04")}}</span>
                <span>浏览量:{{item.Views}}</span>
            </div>
        </a>
    </li>
    {% empty %}
    <li>暂无内容</li>
    {% endfor %}
{% endarchiveList %}

或者在文章详情页显示文章的更新时间:

<article>
    <h1>{% archiveDetail with name="Title" %}</h1>
    <div>
        <span>更新于:{% archiveDetail archiveUpdatedTime with name="UpdatedTime" %}{{stampToDate(archiveUpdatedTime, "2006-01-02 15:04")}}</span>
    </div>
    <div>
        {% archiveDetail archiveContent with name="Content" %}
        {{archiveContent|safe}}
    </div>
</article>

可以看到,stampToDate标签让时间戳的格式化变得非常灵活且强大,只需调整格式化字符串,就能满足几乎所有日期时间显示的需求。

使用建议与注意事项

  • 牢记Go语言格式化标准:这是核心。不要混淆Go语言的2006-01-02 15:04:05参考时间与其他语言的占位符。一旦掌握,便可举一反三。
  • 输入值必须是时间戳stampToDate标签专门用于处理10位或更多位的整数时间戳。如果你的变量已经是time.Time类型的Go语言时间对象,则应该使用date过滤器(如{{ myTimeVar|date:"2006-01-02" }}),但通常在模板中直接操作time.Time对象的情况较少,安企CMS通常会将时间提供为时间戳。
  • 验证显示效果:在修改模板后,务必刷新页面,检查日期时间是否按照预期格式显示。

通过stampToDate这个强大的标签,安企CMS为开发者提供了极大的便利,让时间日期的显示不再是难题,只需简单几步,就能将冰冷的时间戳转化为用户眼前友好的信息。


常见问题 (FAQ)

Q1: 为什么我的日期格式化出来总是显示“2006-01-02”,而不是实际的日期? A1: 这是因为您可能误解了Go语言的时间格式化规则。在stampToDate标签中,"2006-01-02"不是一个占位符,而是一个固定的参考日期。您需要将您想显示的实际日期元素的样式,对照这个参考日期来编写。例如,如果您想显示”年-月-日”,就写"2006-01-02";如果想显示”日/月/年”,就写"02/01/2006"

Q2: 我有一个变量是time.Time类型(或类似日期对象),可以使用stampToDate进行格式化吗? A2: stampToDate标签是专门用来格式化整数时间戳的。如果您的变量已经是后端处理好的time.Time或其他日期对象,您应该尝试使用模板引擎内置的date过滤器(如果可用)或其他适用于该数据类型的格式化方法。在安企CMS的模板中,大部分时间数据会直接以时间戳形式提供,因此stampToDate通常是首选。

Q3: 如果我只需要显示年份、月份或特定部分的日期,格式化字符串怎么写? A3: 您可以根据Go语言的参考时间2006年01月02日 15时04分05秒,只选择您需要的部分。

  • 只显示年份{{stampToDate(item.CreatedTime, "2006")}}
  • 只显示月份{{stampToDate(item.CreatedTime, "01")}} (会显示如”10”) 或 {{stampToDate(item.CreatedTime, "Jan")}} (会显示如”Oct”)
  • 只显示小时和分钟{{stampToDate(item.CreatedTime, "15:04")}}