如何将数据库中的时间戳格式化为可读的日期和时间字符串?

作为一名资深的安企CMS网站运营人员,我深知网站内容不仅仅要丰富,更要以用户友好的方式呈现。时间信息是内容的重要组成部分,但数据库中存储的时间戳(Unix时间戳)往往只是一串数字,直接展示会让人一头雾水。因此,将这些时间戳格式化为易于阅读的日期和时间字符串,是提升用户体验、增加内容可读性的关键一步。

在安企CMS中,我们有一个非常便捷的模板标签来解决这个问题,那就是 stampToDate

理解数据库中的时间戳

安企CMS将内容发布和更新时间等信息存储为10位的Unix时间戳。例如,您可能会在 archiveListarchiveDetail 标签中获取到 item.CreatedTimeitem.UpdatedTime 这样的字段,它们的值可能类似于 1609470335。这串数字代表从1970年1月1日00:00:00 UTC到某一时刻所经过的秒数。虽然精确,但对普通读者来说毫无意义。

安企CMS的解决方案:stampToDate 标签

为了让这些数字变得有意义,安企CMS提供了 stampToDate 模板标签。这个标签能够将传入的10位时间戳按照您指定的格式,转换成可读的日期和时间字符串。

这个标签的使用方式非常直观:

{{stampToDate(时间戳, "格式")}}

其中,时间戳 就是您从数据库字段(如 item.CreatedTime)中获取到的数字。格式 则是您希望日期和时间显示出来的样式,它遵循Go语言特有的时间格式化规则。

深入理解Go语言的时间格式化规则

Go语言的时间格式化规则可能与您在其他编程语言(如PHP的Y-m-d H:i:s或Python的%Y-%m-%d %H:%M:%S)中习惯的不同。在Go语言中,格式化字符串不是用占位符来表示年、月、日等,而是通过一个固定的参考日期和时间来定义输出格式。这个参考日期和时间是:

2006-01-02 15:04:05

您可以将这个参考日期理解为格式“模板”。当您希望输出年份时,就使用 2006;希望输出月份时,就使用 01;希望输出日期时,就使用 02;以此类推。

下面是一些常见的格式化示例,以及它们对应的输出效果:

  • 仅显示日期(年-月-日):
    
    {{stampToDate(item.CreatedTime, "2006-01-02")}}
    {# 示例输出: 2021-06-30 #}
    
  • 显示日期(年/月/日):
    
    {{stampToDate(item.CreatedTime, "2006/01/02")}}
    {# 示例输出: 2021/06/30 #}
    
  • 显示日期和时间(精确到分):
    
    {{stampToDate(item.CreatedTime, "2006-01-02 15:04")}}
    {# 示例输出: 2021-06-30 12:30 #}
    
  • 显示完整日期和时间(精确到秒):
    
    {{stampToDate(item.CreatedTime, "2006-01-02 15:04:05")}}
    {# 示例输出: 2021-06-30 12:30:00 #}
    
  • 仅显示月份和日期:
    
    {{stampToDate(item.CreatedTime, "01-02")}}
    {# 示例输出: 06-30 #}
    
  • 显示中文日期:
    
    {{stampToDate(item.CreatedTime, "2006年01月02日")}}
    {# 示例输出: 2021年06月30日 #}
    
  • 显示带有星期几的日期:
    
    {{stampToDate(item.CreatedTime, "Mon Jan _2 2006")}}
    {# 示例输出: Wed Jun 30 2021 #}
    

您可以根据实际需求,灵活组合 20060102150405 以及其他Go语言支持的时间格式元素来创建独特的日期时间字符串。

实际应用:在模板中格式化文档时间

在安企CMS的模板中,当我们使用 archiveListarchiveDetail 等标签获取文档数据时,通常会包含 CreatedTime(创建时间)和 UpdatedTime(更新时间)字段。这些字段的值就是10位的时间戳。我们可以直接将它们作为 stampToDate 的第一个参数进行格式化。

例如,在一个文档详情页,您可能希望显示文档的发布时间:

<article>
    <h1>{{archive.Title}}</h1>
    <div class="article-meta">
        <span>发布于:{{stampToDate(archive.CreatedTime, "2006年01月02日 15:04")}}</span>
        <span>浏览量:{{archive.Views}}</span>
    </div>
    <div class="article-content">
        {{archive.Content|safe}}
    </div>
</article>

在这个例子中,archive.CreatedTime 将被格式化为 2021年06月30日 12:30 这样的字符串,极大地提升了用户对时间信息的理解。

总结

通过 stampToDate 标签,安企CMS提供了一种强大而灵活的方式来处理和展示数据库中的时间戳数据。掌握Go语言的时间格式化规则是正确使用此标签的关键,它让您能够根据不同的设计和用户需求,将冰冷的数字时间戳转化为温暖、易懂的日期和时间字符串,从而优化您的网站内容表现和用户体验。


常见问题解答 (FAQ)

1. 我从数据库获取的时间戳不是10位数字,而是更长的数字(例如13位),应该如何处理?

10位时间戳通常指的是Unix时间戳(秒),而13位时间戳通常表示Unix毫秒时间戳。安企CMS的 stampToDate 标签默认期望接收10位的Unix时间戳(秒)。如果您的时间戳是13位的毫秒时间戳,您需要在将其传递给 stampToDate 之前,先进行简单的数学运算将其转换为秒。例如,可以使用除以1000的方式:{{stampToDate(item.MilliTimestamp / 1000, "2006-01-02 15:04:05")}}。请务必检查您的数据源,确认时间戳的实际单位。

2. Go语言的时间格式化规则(2006-01-02 15:04:05)看起来很奇怪,有没有更直观的方法来记忆?

Go语言的参考日期 2006-01-02 15:04:05 可以被分解为以下数字,每个数字代表一个特定的时间单位:

  • 2006 代表年份
  • 01 代表月份(1月)
  • 02 代表日期(2日)
  • 15 代表小时(下午3点,24小时制)
  • 04 代表分钟
  • 05 代表秒

您可以将它记忆为“1月2号,下午3点4分5秒,在2006年”。当您想要在格式中包含某个时间单位时,就使用它对应的数字。例如,想要显示年份,就写 2006;想要显示月份,就写 01。这是一种非常独特但一旦掌握就非常灵活的格式化方式。

3. 除了 stampToDate 之外,安企CMS还有其他与时间相关的模板标签吗?

是的,除了格式化数据库中的时间戳,安企CMS还提供了 {% now "格式" %} 标签来获取并格式化当前的系统时间。它的格式化规则与 stampToDate 完全相同,都是遵循Go语言的参考日期格式。例如,要显示当前的年份,可以使用 {% now "2006" %}。这个标签常用于在页脚显示当前年份的版权信息,或在其他需要显示实时时间的地方。