这个标签的核心作用是显示文章、栏目或其他内容的发布或更新时间,根据不同的场景和需求,有多种调用方式。
基础发布时间标签(最常用)
这是在文章列表页(如 list_article.htm)或文章内容页(如 article_article.htm)中最常用的标签。
标签代码:
[field:pubdate function='strftime("%Y-%m-%d %H:%M:%S",@me)'/]
参数解析:
[field:pubdate ... ]:这是调用文章发布时间字段的固定写法。function='...':表示对获取到的值进行一次函数处理。strftime():是 PHP 中一个强大的格式化时间的函数。"%Y-%m-%d %H:%M:%S":这是格式化字符串,你可以根据自己的喜好修改它。%Y:四位数的年份(2025)%y:两位数的年份(23)%m:两位数的月份(01-12)%d:两位数的天数(01-31)%H:24小时制的小时(00-23)%I:12小时制的小时(01-12)%M:分钟(00-59)%S:秒(00-59)%F:等同于%Y-%m-%d(2025-10-27)%D:等同于%m/%d/%y(10/27/23)
使用示例:
-
显示
年-月-日格式:[field:pubdate function='strftime("%Y-%m-%d",@me)'/]输出效果:
2025-10-27 -
显示
年/月/日 时:分格式:[field:pubdate function='strftime("%Y/%m/%d %H:%M",@me)'/]输出效果:
2025/10/27 14:30 -
只显示
月-日格式:[field:pubdate function='strftime("%m-%d",@me)'/]输出效果:
10-27
显示文章更新时间
你可能希望显示文章最后一次更新的时间,而不是最初发布的时间,在 Dedecms 中,文章的更新时间字段通常是 senddate。
标签代码:
[field:senddate function='strftime("%Y-%m-%d %H:%M:%S",@me)'/]
使用场景: 在文章列表中,如果文章被修改过,可以显示“更新于:...”的时间,让用户知道内容是新的。
示例(带条件判断):
你可以结合 {dede:field name='pubdate' function='strftime("%Y-%m-%d",@me)'/} 和 {dede:field name='senddate' function='strftime("%Y-%m-%d",@me)'/} 来判断发布时间和更新时间是否一致,如果不一致则显示更新时间。
{dede:field name='pubdate' function='strftime("%Y-%m-%d",@me)'/}
{dede:field name='pubdate' function='strftime("%Y-%m-%d",@me)' != dede:field name='senddate' function='strftime("%Y-%m-%d",@me)'}
<span style="color: #ff6600;"> (更新于: {dede:field name='senddate' function='strftime("%Y-%m-%d",@me)'/}) </span>
{/dede:field}
这段代码的意思是:先显示发布时间,然后判断发布时间是否不等于更新时间,如果不等于,就追加一个橙色的“更新于...”提示。
在首页、栏目页调用文章发布时间
在首页 (index.htm) 或栏目列表页 (list_x.htm),你需要使用 {dede:arclist} 标签循环调用文章,然后在其中使用 [field:pubdate]。
完整示例(在首页调用):
{dede:arclist row='8' titlelen='30'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span class="time">[field:pubdate function='strftime("%Y-%m-%d",@me)'/]</span>
</li>
{/dede:arclist}
参数解释:
row='8':表示调用 8 篇文章,len='30'`:表示标题最多显示 30 个字符。[field:arcurl/]:文章的链接地址。[field:title/]:文章的标题。[field:pubdate ... ]:就是我们上面讲的发布时间标签。
修改时间显示格式(后台全局设置)
如果你想让整个网站的时间格式统一修改,可以在后台进行全局设置,这样就不需要在每个模板文件里都写一遍 function 了。
操作路径: 登录 Dedecms 后台 -> 系统 -> 系统基本参数 -> 核心设置
在“核心设置”页面中,找到 “时间格式化” 这一栏,默认值通常是 Y-m-d H:i:s,你可以在这里直接修改为你想要的格式,Y/m/d 或 m-d。
优点:
- 一改全改:修改后,所有使用默认时间标签的地方(如
[field:pubdate/])都会自动应用新格式。 - 方便快捷:不需要逐个修改模板文件。
缺点:
- 不够灵活:如果你希望某个页面的时间格式和其他页面不一样,这种方法就无法满足需求,你还是需要使用带
function的标签进行单独设置。
常见问题与解决
Q1: 为什么我直接写 [field:pubdate/] 显示的是一串数字?
A1: 因为 Dedecms 默认存储的时间是 Unix 时间戳(1698384600)。[field:pubdate/] 单独使用时,系统会尝试用后台“核心设置”里的格式来转换它,如果后台没有设置或者设置错误,就可能显示原始时间戳。最稳妥的方法就是使用 strftime 函数进行格式化,如 [field:pubdate function='strftime("%Y-%m-%d",@me)'/]。
Q2: 我想显示“刚刚”、“5分钟前”、“昨天”这样的相对时间怎么办?
A2: Dedecms 默认不直接支持,但可以通过自定义函数或修改 /include/extend.func.php 文件来实现。
方法:在 /include/extend.func.php 文件末尾添加以下函数:
/**
* 将时间戳转换为相对时间字符串(如:刚刚, 5分钟前, 昨天)
* @param string $time 时间戳
* @return string
*/
function formatTime($time) {
$timer = time() - $time;
$second = $timer;
$minute = floor($timer / 60);
$hour = floor($timer / 3600);
$day = floor($timer / 86400);
$week = floor($timer / 604800);
$month = floor($timer / 2592000);
$year = floor($timer / 31536000);
if ($second < 60) return $second . "秒前";
elseif ($minute < 60) return $minute . "分钟前";
elseif ($hour < 24) return $hour . "小时前";
elseif ($day == 0) return "昨天 " . date('H:i', $time);
elseif ($day < 7) return $day . "天前";
elseif ($week < 4) return $week . "周前";
elseif ($month < 12) return $month . "个月前";
else return $year . "年前";
}
然后在模板文件中使用这个新函数:
[field:pubdate function='formatTime(@me)'/]
这样,文章发布时间就会智能地显示为“刚刚”、“5分钟前”、“昨天”等更人性化的格式。
| 需求场景 | 推荐标签代码 | 说明 |
|---|---|---|
| 常用时间格式 | [field:pubdate function='strftime("%Y-%m-%d",@me)'/] |
灵活,可自定义格式,推荐使用。 |
| 显示更新时间 | [field:senddate function='strftime("%Y-%m-%d",@me)'/] |
调用文章的修改时间字段。 |
| 列表页调用 | {dede:arclist}...[field:pubdate function='...'/]...{/dede:arclist} |
在循环列表中使用。 |
| 全局统一格式 | 后台:系统 -> 系统基本参数 -> 核心设置 | 修改“时间格式化”,一劳永逸。 |
| 显示相对时间 | 先在 extend.func.php 添加函数,再用 [field:pubdate function='formatTime(@me)'/] |
显示“刚刚”、“几分钟前”等。 |
希望这份详细的解析能帮助你完全掌握 Dedecms 的发布时间标签!
