
本文讲解如何在 PHP 中正确判断并处理 HTML 表单提交的空时间字段,防止 strtotime('') 意外返回当前时间戳,确保未填写时输出为空(而非当前时间),并提供健壮、可维护的代码实践。
本文讲解如何在 php 中正确判断并处理 html 表单提交的空时间字段,防止 `strtotime('')` 意外返回当前时间戳,确保未填写时输出为空(而非当前时间),并提供健壮、可维护的代码实践。
在使用 strtotime() 处理用户输入的时间字符串时,一个常见却容易被忽视的陷阱是:当传入空字符串(如 '')、null 或仅含空白字符的值时,strtotime('') 会静默返回当前时间戳(等价于 time()),而非 false。这正是你遇到问题的根本原因——date('h:i a', strtotime('')) 实际上等价于 date('h:i a', time()),因此总显示当前时间。
你原先的写法:
if ($da1 == "") {
$da1 = "";
} else {
$da1 = date('h:i a ', strtotime($da1));
}存在两个关键问题:
- 使用松散比较 == "" 无法可靠识别 null、0、false 等“空值”,且逻辑冗余;
- 即使 $da1 为空,仍执行了 strtotime(''),触发了意外的当前时间回退。
✅ 正确做法是:在调用 strtotime() 前,严格校验输入是否为有效、非空、可解析的时间字符串。推荐使用 !empty() 或更精准的 is_string($da1) && trim($da1) !== '':
// ✅ 推荐方案:分离输入与输出变量,显式控制空值行为
$savedTime = ''; // 默认为空字符串(或 null,依业务而定)
if (is_string($da1) && trim($da1) !== '') {
$timestamp = strtotime($da1);
if ($timestamp === false) {
// 可选:记录警告或跳过解析(防止无效格式如 "abc:de")
$savedTime = '';
} else {
$savedTime = date('h:i a', $timestamp); // 注意:末尾空格已移除,更规范
}
}
// $savedTime 将保持为空字符串,绝不会意外变成当前时间⚠️ 注意事项:
- 永远不要对未经验证的用户输入直接调用 strtotime();
- 避免复用原始表单变量(如 $da1)存储转换结果,易引发逻辑混淆和调试困难;
- 若表单使用 <input type="time">,注意其值格式为 HH:MM(24小时制),strtotime() 可直接解析,但需确保浏览器兼容性;
- 在 TCPDF 中插入 $savedTime 时,可直接使用:$pdf->Cell(0, 10, $savedTime, 0, 1); —— 当为空时将渲染空白单元格。
总结:核心原则是「防御性编程」——先验真,再转换;明确区分数据来源与业务输出;用强类型意识替代模糊比较。这样既能杜绝空输入导致的时间污染,也提升了代码的可读性与可维护性。


















