在列表页、文章页等模板文件中直接格式化
这是最常见的情况,我们通常使用 DedeCMS 的内置函数 MyDate() 来完成。

函数语法
MyDate(formatString, timestamp)
formatString(必需): 你想要的日期格式,这里的格式化字符与 PHP 的date()函数基本一致。timestamp(可选): Unix 时间戳,如果不提供,默认使用当前时间。
常用格式化字符
| 字符 | 说明 | 示例 |
|---|---|---|
Y |
4位数字的完整年份 | 2025 |
y |
2位数字的年份 | 23 |
m |
带前导0的数字月份 (01-12) | 08 |
n |
不带前导0的数字月份 (1-12) | 8 |
d |
带前导0的日期 (01-31) | 09 |
j |
不带前导0的日期 (1-31) | 9 |
H |
24小时制,带前导0 (00-23) | 14 |
h |
12小时制,带前导0 (01-12) | 02 |
i |
带前导0的分钟 (00-59) | 05 |
s |
带前导0的秒数 (00-59) | 09 |
D |
英文星期几的3个字母 (Sun-Sat) | Mon |
F |
英文完整的月份名称 (January-December) | August |
w |
数字表示的星期几 (0代表周日, 6代表周六) | 1 |
A |
大写的上午和下午 (AM/PM) | PM |
实际应用示例
假设你有一个文章变量 pubdate (发布时间),它存储的是 Unix 时间戳。
示例 1:格式化为 年-月-日
{dede:field.pubdate function='MyDate("Y-m-d",@me)'/}
输出:2025-08-09

示例 2:格式化为 年/月/日 时:分
{dede:field.pubdate function='MyDate("Y/m/d H:i",@me)'/}
输出:2025/08/09 14:30
示例 3:格式化为 年-月-日 时:分:秒
{dede:field.pubdate function='MyDate("Y-m-d H:i:s",@me)'/}
输出:2025-08-09 14:30:25

示例 4:格式化为 月-日
在列表页,通常只需要显示月和日。
{dede:field.pubdate function='MyDate("m-d",@me)'/}
输出:08-09
示例 5:格式化为中文格式,如 2025年08月09日
{dede:field.pubdate function='MyDate("Y年m月d日",@me)'/}
输出:2025年08月09日
在自定义函数或PHP代码中格式化
如果你在 include/common.func.php 文件中写了自定义函数,或者在模板中使用了 {dede:php} 标签,那么你可以直接使用 PHP 原生的 date() 函数,这更灵活。
使用 PHP 的 date() 函数
date(formatString, timestamp)
用法和 MyDate() 几乎一样,但更符合 PHP 的标准。
示例:在自定义函数中
假设你在 include/common.func.php 中添加了一个函数:
function getShortDate($timestamp) {
return date('m-d', $timestamp);
}
然后在模板中调用:
{dede:field.pubdate function='getShortDate(@me)'/}
示例:在 {dede:php} 标签中
{dede:php}
$timestamp = time(); // 获取当前时间戳
$formattedDate = date('Y年m月d日 H时i分', $timestamp);
echo $formattedDate;
{/dede:php}
输出:2025年08月09日 14时30分
修改后台发布文章时的默认日期格式
有时候你希望后台发布文章时,默认的日期显示格式不是 Y-m-d H:i:s,而是其他格式,这需要修改 PHP 文件。
操作步骤:
- 找到文件:打开
dede/archives_add.php(用于发布文章) 或dedi/article_add.php等相关文件。 - 定位代码:搜索
$pubdate或sendtime变量,你会找到类似这样的代码:// ... 其他代码 ... $pubdate = GetMkTime($pubdate); // 处理发布日期 $senddate = time(); // 默认为当前时间 // ... 其他代码 ...
- 修改默认值:如果你想修改
senddate的默认显示格式,可以找到它在模板中对应的变量,通常是在发布文章的表单里,查找input标签的value属性,但这比较复杂。
一个更简单的方法是,在文章保存到数据库之前,对 $pubdate 或 $senddate 进行一次格式化,但这通常不推荐,因为这会改变数据库存储的原始时间戳。
更推荐的方案是: 保持数据库中存储标准的 Unix 时间戳,在前台模板(场景一)和后台显示列表时,统一使用 MyDate() 函数来格式化,这样,无论你想在后台或前台显示成什么格式,都只需要修改模板或标签,而不用动核心文件,更安全。
修改列表页的日期显示(列表项 list 循环中)
在列表页模板(通常是 list_article.htm),日期通常在 {dede:list} 循环内部,通过 {field:pubdate} 来调用。
格式化方法和普通字段一样,直接在标签里使用 function 即可。
示例 list_article.htm 片段:
<ul>
{dede:list pagesize='10'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span class="date">[field:pubdate function='MyDate("Y-m-d",@me)'/]</span>
</li>
{/dede:list}
</ul>
这样,每篇文章的发布日期都会被格式化为 年-月-日 的形式。
总结与最佳实践
| 需求场景 | 推荐方法 | 示例 |
|---|---|---|
| 前台模板(列表、文章页) | 使用 MyDate() 函数 |
{dede:field.pubdate function='MyDate("Y-m-d",@me)'/} |
| 自定义函数 | 使用 PHP 原生 date() 函数 |
return date('Y-m-d', $timestamp); |
| 后台代码修改 | 尽量避免,保持时间戳原始性,通过模板控制显示格式。 | - |
| 列表页循环内 | 使用 MyDate() 函数 |
[field:pubdate function='MyDate("m-d",@me)'/] |
核心要点:
MyDate()是 DedeCMS 提供给模板的便捷函数,专门用来格式化时间戳。@me是当前字段的占位符,在function中必须使用,它代表{dede:field.xxx}的原始值(在这里就是时间戳)。- 始终在数据库中存储 Unix 时间戳,这是最标准、最灵活的方式,所有的格式化工作都应在输出时(即模板层)完成。
希望这份详细的指南能帮助你完全掌握 DedeCMS 的日期格式化!
