- 用户提交一个日期:比如用户填写“生日”、“活动日期”等。
- 系统自动记录提交时间:记录用户填写表单的精确时间。
下面我将详细讲解这两种情况的实现方法。

用户提交一个日期(如生日、活动日期)
这种情况需要你在制作表单时提供一个日期选择器,然后在后台管理和数据调用时正确地显示这个日期。
步骤 1:在自定义表单中添加日期字段
- 进入后台:登录你的 DedeCMS 后台。
- 找到表单管理:菜单栏 -> 核心 -> 内容模型管理 -> 自定义表单。
- 编辑表单:找到你想要修改的自定义表单,点击后面的 [管理字段] 或 [修改]。
- 添加新字段:
- 点击 [增加字段]。
- 字段名:
birthday(英文,不能有特殊字符) - 字段提示:
您的生日(这是前端显示给用户的提示文字) - 字段类型:【日期时间】 (这是最关键的一步,选择这个类型系统会自动提供一个日期选择器)
- 其他选项:根据需要填写,比如是否为必填项等。
- 点击 [保存]。
你的自定义表单数据表(通常是 dede_addonxx)里就有了一个专门存储日期的字段。
步骤 2:在前端表单中显示日期选择器
DedeCMS 的自定义表单默认会根据你设置的“字段类型”自动渲染成相应的表单元素。【日期时间】 类型通常会生成一个 <input type="text"> 并附加一个 JS 日期选择器。
你只需要在模板文件(/templets/plus/post_diyform.htm)中,像调用普通文本框一样调用它即可,DedeCMS 的标签会自动处理。

示例代码 (post_diyform.htm):
<div class="form-group">
<label for="birthday">您的生日:</label>
{dede:field name='birthday' /}
<span class="red">*</span> (如果设置了必填)
</div>
当用户在前端页面访问这个表单时,就会看到一个带有日期选择功能的输入框。
步骤 3:后台管理和数据调用
后台查看数据
在后台的自定义表单管理页面,你提交的数据会显示在列表中,日期字段会以 YYYY-MM-DD HH:MM:SS 的格式显示,非常清晰。
在首页或列表页调用数据
这是最常见的需求,你需要使用 DedeCMS 的自定义表单调用标签,并利用 strftime 函数来格式化日期显示。
基本调用标签:
{dede:loop table='dede_addon18' sort='id' row='10'}
<p>
提交人:[field:uname /]
生日:[field:birthday function='strftime("%Y-%m-%d",@me)'/]
</p>
{/dede:loop}
标签详解:
{dede:loop table='...' ...}: 循环调用标签。table='dede_addon18': 这是关键!dede_addon18是你的自定义表单对应的数据表,你可以在后台的 [自定义表单] -> [表单管理] 中查看每个表单对应的表名,dede_addonxx这个xx是数字。sort='id': 按ID排序,默认是倒序(最新的在前)。row='10': 调用10条数据。
[field:birthday ...]: 调用名为birthday的字段。function='strftime("%Y-%m-%d",@me)': 这是格式化日期的核心函数。strftime: PHP 的一个函数,用于格式化本地时间/日期。"%Y-%m-%d": 这是你想要的输出格式。%Y: 四位数的年份 (如 2025)%m: 两位数的月份 (如 01, 12)%d: 两位数的日期 (如 05, 31)%H: 24小时制的小时%M: 分钟%S: 秒
@me: 这是 DedeCMS 标签系统中的固定写法,代表当前字段的原始值。
其他格式化示例:
- 显示
年-月-日 时:分:[field:birthday function='strftime("%Y-%m-%d %H:%M",@me)'/] - 只显示年份:
[field:birthday function='strftime("%Y",@me)'/]
自动记录表单提交时间
如果你想在用户提交表单时,自动记录下他们提交的精确时间(而不是由他们自己填写),可以创建一个 datetime 类型的字段,并利用 DedeCMS 的钩子机制自动填充它。
步骤 1:添加一个自动时间字段
- 和场景一一样,进入 自定义表单 -> [管理字段]。
- 增加一个新字段:
- 字段名:
sendtime(或posttime,addtime等你喜欢的名字) - 字段提示:
提交时间(这个提示对用户无意义,主要是方便你识别) - 字段类型:【日期时间】
- 勾选 【设置为系统字段】 (这一步很重要,可以避免在后台编辑时被误修改)。
- 点击 [保存]。
- 字段名:
步骤 2:修改PHP文件以自动填充时间
DedeCMS 在处理自定义表单提交时,会调用一个特定的PHP文件,我们需要修改这个文件,在数据入库前,给 sendtime 字段赋上当前时间。
- 找到文件:打开
/plus/diy.php文件。 - 定位代码:找到
$query = "INSERT INTO{$diy->table}".implode('', $addvalue).") VALUES('$addvalue')";这一行,这行代码是构造SQL语句进行数据插入的。 - 修改代码:在这行代码之前,添加如下代码:
// 在 $query = "INSERT INTO..." 之前添加 // 给提交时间字段赋值 $addvalue['sendtime'] = time(); // 获取当前Unix时间戳 // 如果你的字段名是 posttime, 就用 $addvalue['posttime'] = time();
完整代码片段示例:
// ... 前面的代码 ...
// 获取表单提交过来的数据
$addvalue = array();
$fieds = empty($diy->itemsets) ? $diy->fields : $diy->itemsets;
foreach($fieds as $field) {
if($field->formtype == 'img' || $field->formtype == 'addon') {
continue;
}
$addvalue[$field->fieldname] = ${'_'.$field->fieldname};
}
// ====== 在这里添加我们的自动时间代码 ======
// 如果存在 sendtime 这个字段,则自动填充当前时间
if (isset($addvalue['sendtime'])) {
$addvalue['sendtime'] = time();
}
// ==========================================
// 准备插入数据库
$addvalue = ReplaceKey($addvalue);
$inquery = "INSERT INTO `{$diy->table}` (`".implode('`,`', array_keys($addvalue))."`) VALUES('".implode("','", $addvalue)."')";
// ... 后面的代码 ...
代码解释:
$addvalue是一个关联数组,存放了所有要插入的字段名和对应的值。if (isset($addvalue['sendtime'])):判断我们之前创建的sendtime字段是否存在。$addvalue['sendtime'] = time();:如果存在,就调用time()函数获取当前时间的 Unix 时间戳,并赋值给sendtime字段。
步骤 3:调用和显示
每当用户提交表单,sendtime 字段都会被自动填入当前时间,调用方式和场景一完全一样,同样使用 strftime 进行格式化。
{dede:loop table='dede_addon18' sort='id' row='10'}
<p>
提交人:[field:uname /]
提交时间:[field:sendtime function='strftime("%Y-%m-%d %H:%M:%S",@me)'/]
</p>
{/dede:loop}
| 场景 | 字段类型 | 关键操作 | 前端标签调用 |
|---|---|---|---|
| 用户提交日期 | 【日期时间】 |
后台添加字段 前端模板直接调用 |
[field:字段名 function='strftime("格式",@me)'/] |
| 自动记录时间 | 【日期时间】 |
后台添加字段并勾选“系统字段” 修改 /plus/diy.php,用 $addvalue['字段名'] = time(); 自动填充 |
[field:字段名 function='strftime("格式",@me)'/] |
希望这个详细的教程能帮助你解决在 DedeCMS 自定义表单中处理日期的问题!
