Unix 时间戳(Timestamp)是从 1970 年 1 月 1 日 00:00:00 UTC 到某个时间点所经过的秒数,它是一种独立于时区和编程语言的通用时间表示方法。

在 DedeCMS 中,时间戳主要用于数据库存储、模板显示和一些底层逻辑计算。
DedeCMS 中 Unix 时间戳的存储位置
在 DedeCMS 的数据库中,核心内容表(如 dede_archives)里有两个关键的时间字段:
senddate: 文章的 发布时间,这个字段在后台发布文章时被记录,并以 Unix 时间戳的形式存储。pubdate: 文章的 录入时间,这个字段通常与senddate相同,表示文章首次被录入系统的时间,同样以 Unix 时间戳存储。
你可以通过在后台管理系统中进入“系统” -> “SQL命令行工具”,执行以下 SQL 语句来查看文章的 ID、标题和其 Unix 时间戳:
SELECT id, title, senddate, pubdate FROM dede_archives LIMIT 10;
你会发现 senddate 和 pubdate 列下的数字就是 Unix 时间戳,1712345678。

如何在模板中显示格式化后的时间
这是最常见的需求,我们通常不希望直接显示一长串数字,而是希望显示为 YYYY-MM-DD HH:MM:SS 这样的格式。
DedeCMS 模板引擎(使用 php 标签)提供了两种主要方法来实现时间戳的转换。
使用 MyDate() 函数(推荐)
这是 DedeCMS 内置的、最常用的时间格式化函数,它专门用于处理从数据库中获取的 Unix 时间戳。
语法:
{dede:field.function='MyDate("格式", 时间戳值)'/}

或者,如果当前标签就是文章时间,可以直接使用:
{dede:field.senddate function='MyDate("格式", @me)'/}
常用格式说明:
Y-m-d H:i:s->2025-04-08 15:30:25Y-m-d->2025-04-08Y年m月d日->2025年04月08日H:i:s->15:30:25m-d->04-08
示例:
假设文章的 Unix 时间戳是 1712345678。
-
显示完整的发布时间:
{dede:field.senddate function='MyDate("Y-m-d H:i:s", @me)'/}输出结果:
2025-04-08 15:31:18 -
显示简短的日期:
发布日期:{dede:field.senddate function='MyDate("Y-m-d", @me)'/}输出结果:
发布日期:2025-04-08 -
显示中文格式的日期:
{dede:field.senddate function='MyDate("Y年m月d日", @me)'/}输出结果:
2025年04月08日
使用原生 PHP 的 date() 函数
你也可以在模板中使用标准的 PHP 代码块来实现,这种方法更灵活,可以执行更复杂的 PHP 逻辑。
语法:
{dede:php}$timestamp = $fields['senddate']; echo date("Y-m-d H:i:s", $timestamp);{/dede:php}
或者使用 @me 变量(@me 代表当前标签的值):
{dede:field.senddate runphp='yes'}@me = date("Y-m-d", @me);{/dede:field.senddate}
示例:
-
显示完整发布时间:
{dede:field.senddate runphp='yes'} @me = date("Y-m-d H:i:s", @me); {/dede:field.senddate} -
计算并显示“X天前”这样的相对时间:
{dede:field.senddate runphp='yes'} $time = time() - @me; if($time < 60) @me = $time.'秒前'; elseif($time < 3600) @me = floor($time/60).'分钟前'; elseif($time < 86400) @me = floor($time/3600).'小时前'; else @me = floor($time/86400).'天前'; {/dede:field.senddate}
如何将格式化时间转换回 Unix 时间戳
在某些场景下,你可能需要将一个字符串格式的时间(比如用户输入的时间)转换回 Unix 时间戳再存入数据库。
这通常需要编写一个小的 PHP 脚本或修改发布程序。
核心 PHP 函数:strtotime()
这个函数可以将任何英文文本日期时间描述解析为 Unix 时间戳。
示例:
假设你有一个变量 $formatted_time = '2025-04-08 15:30:25';
<?php $formatted_time = '2025-04-08 15:30:25'; // 将格式化时间转换为 Unix 时间戳 $timestamp = strtotime($formatted_time); echo $timestamp; // 输出:1712345425 ?>
在 DedeCMS 的实际应用中,这个转换过程通常发生在你保存数据到数据库之前,在自定义表单处理或修改发布程序的逻辑时,你需要将接收到的表单时间字符串用 strtotime() 转换后再赋值给 senddate 和 pubdate 字段。
常见问题与技巧
Q: 为什么我直接用 {dede:field.senddate/} 显示出来的是一长串数字?
A: 因为 senddate 字段在数据库里存储的就是 Unix 时间戳,DedeCMS 的标签系统默认会直接输出变量的原始值,你必须使用 function 或 runphp 属性来调用格式化函数,如 MyDate() 或 date(),才能将其转换成可读的格式。
Q: MyDate() 和 date() 有什么区别?
A:
MyDate(): 是 DedeCMS 的封装函数,专门用于处理数据库时间戳,语法更简洁,模板新手更容易上手。date(): 是 PHP 原生函数,功能更强大,可以处理任何有效的时间戳或日期字符串,并且可以在runphp='yes'的标签中执行更复杂的逻辑。
对于简单的格式化,推荐使用 MyDate(),对于需要条件判断、循环等复杂操作,使用 date() 结合 runphp 更合适。
Q: 如何获取当前时间的 Unix 时间戳?
A: 在 PHP 中,使用 time() 函数。
在模板中:
{dede:php}echo time();{/dede:php}
或者如果你想格式化显示当前时间:
{dede:php}echo date('Y-m-d H:i:s', time());{/dede:php}
| 需求 | 解决方案 | 示例 |
|---|---|---|
| 显示格式化后的发布时间 | 使用 MyDate() 函数 |
{dede:field.senddate function='MyDate("Y-m-d", @me)'/} |
| 显示格式化后的录入时间 | 使用 MyDate() 函数 |
{dede:field.pubdate function='MyDate("Y-m-d", @me)'/} |
| 执行复杂的时间逻辑 | 使用 date() 函数和 runphp |
{dede:field.senddate runphp='yes'}@me = date('Y-m', @me);{/dede:field.senddate} |
| 将字符串转为时间戳(存库用) | 使用 PHP 的 strtotime() 函数 |
$timestamp = strtotime('2025-04-08'); |
| 获取当前时间戳 | 使用 PHP 的 time() 函数 |
{dede:php}echo time();{/dede:php} |
掌握了这些方法,你就可以在 DedeCMS 中自如地处理所有与时间戳相关的操作了。
