使用 GetDateTime() 函数
这是在列表页循环({dede:list})中调用文章时间的最标准、最常用的方法。

基础调用:显示完整日期和时间
这个方法会显示文章发布的完整日期和时间,格式为 YYYY-MM-DD HH:MM:SS。
代码位置: 在 {dede:list} 标签对之间使用。
代码示例:
{dede:list pagesize='10'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>发布时间:[field:pubdate function="GetDateTime(@me)"/]</span>
</li>
{/dede:list}
代码解释:

[field:pubdate/]:这是获取文章发布时间戳的原始字段,它返回的是一个 Unix 时间戳(1712345678)。function="GetDateTime(@me)":这是一个函数调用。function="...":告诉DedeCMS这里要执行一个PHP函数。@me:这是一个特殊变量,代表当前字段的原始值,也就是[field:pubdate/]得到的时间戳。GetDateTime():是DedeCMS内置的一个PHP函数,它的作用就是将Unix时间戳格式化为YYYY-MM-DD HH:MM:SS的字符串。
进阶用法:自定义时间格式
很多时候,我们不需要显示完整的时间,只需要显示年-月-日,或者年-月等,这时,我们可以使用 MyDate() 函数,它比 GetDateTime() 更灵活。
使用 MyDate() 函数自定义格式
MyDate() 函数可以让你自由定义输出时间的格式。
语法: [field:pubdate function="MyDate('格式', @me)"/]
常用格式占位符:
Y:四位数的年份 (2025)m:两位数的月份 (04)d:两位数的日 (08)H:24小时制的小时 (15)i:分钟 (08)s:秒 (30)M:英文月份缩写 (Apr)F:英文月份全称 (April)
代码示例:
示例1:只显示 年-月-日
{dede:list}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
</li>
{/dede:list}
输出效果: 2025-04-08
示例2:显示 年月日 时分
{dede:list}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d H:i', @me)"/]</span>
</li>
{/dede:list}
输出效果: 2025-04-08 15:30
示例3:显示中文格式的 年月日
{dede:list}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y年m月d日', @me)"/]</span>
</li>
{/dede:list}
输出效果: 2025年04月08日
特殊需求调用
显示文章发布后的“多久前”(如:3天前、2小时前)
这种“人性化”的时间显示在现在非常流行,DedeCMS 没有内置这个函数,但我们可以通过自定义一个函数来实现。
步骤:
第一步:在 /include/extend.func.php 文件中添加自定义函数
打开你网站根目录下的 /include/extend.func.php 文件,在文件末尾的 ?> 之前,添加以下PHP代码:
/**
* 将时间戳转换为“X天前”或“X小时前”等格式
* @param string $from Unix时间戳
* @return string
*/
function formatTimeAgo($from) {
$now = time();
$diff = $now - $from;
// 如果时间差小于60秒
if ($diff < 60) {
return '刚刚';
}
// 如果时间差小于3600秒(1小时)
elseif ($diff < 3600) {
return floor($diff / 60) . '分钟前';
}
// 如果时间差小于86400秒(1天)
elseif ($diff < 86400) {
return floor($diff / 3600) . '小时前';
}
// 如果时间差小于2592000秒(30天)
elseif ($diff < 2592000) {
return floor($diff / 86400) . '天前';
}
// 如果时间差小于31536000秒(365天)
elseif ($diff < 31536000) {
return floor($diff / 2592000) . '个月前';
}
// 超过1年
else {
return floor($diff / 31536000) . '年前';
}
}
第二步:在列表页模板中调用这个函数
保存并关闭 extend.func.php 文件后,在你的列表页模板(list_*.htm)中,使用如下方式调用:
{dede:list}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="formatTimeAgo(@me)"/]</span>
</li>
{/dede:list}
代码解释:
- 我们在
extend.func.php中定义了一个名为formatTimeAgo()的函数。 - 在模板中,我们通过
function="formatTimeAgo(@me)"来调用它,并将文章的时间戳@me作为参数传递进去。 - 这个函数会根据当前时间和文章发布时间的差值,返回“刚刚”、“几分钟前”等字符串。
总结与对比
| 方法 | 代码示例 | 输出格式 | 适用场景 |
|---|---|---|---|
GetDateTime() |
[field:pubdate function="GetDateTime(@me)"/] |
YYYY-MM-DD HH:MM:SS |
需要显示精确发布时间的场景,如后台管理、新闻列表。 |
MyDate() |
[field:pubdate function="MyDate('Y-m-d', @me)"/] |
Y-m-d (可自定义) |
最常用,可以根据设计需要自由调整时间格式,如列表页、文章归档页。 |
| 自定义函数 | [field:pubdate function="formatTimeAgo(@me)"/] |
X天前、X小时前 |
社交化、人性化的时间显示,如博客、论坛、动态信息流。 |
最佳实践建议:
对于绝大多数DedeCMS列表页的需求,强烈推荐使用 MyDate() 函数,因为它既灵活又高效,只需根据你的设计稿调整 MyDate() 中的格式字符串即可,Y-m-d 或 Y.m.d。
希望这些详细的解释和示例能帮助你完美地在列表页调用时间!
