
当从 HTML 表单获取时间字段(如 $da1)时,若用户未填写,strtotime('') 会返回 false,而 date() 对其调用将意外输出当前时间;本文提供健壮、可读性强的解决方案,确保空输入严格保持为空,而非回退到当前时间。
当从 html 表单获取时间字段(如 `$da1`)时,若用户未填写,`strtotime('')` 会返回 `false`,而 `date()` 对其调用将意外输出当前时间;本文提供健壮、可读性强的解决方案,确保空输入严格保持为空,而非回退到当前时间。
在使用 date('h:i a', strtotime($da1)) 格式化表单提交的时间时,一个常见却危险的陷阱是:当 $da1 为空字符串("")、null 或仅含空白字符时,strtotime('') 返回 false,而 date() 函数会将 false 隐式转换为 0(即 Unix 纪元时间 1970-01-01 00:00:00),但更常见的是——PHP 8+ 中 strtotime(false) 触发警告,而 strtotime('') 实际返回 false,date() 遇到无效时间戳则默认使用当前时间。这正是你观察到“空白时显示当前时间”的根本原因。
✅ 正确做法:显式校验 + 分离变量
应避免直接复用原始表单变量进行逻辑与格式化操作,并优先使用严格、语义清晰的空值判断:
// ✅ 推荐:使用 !empty() 显式检查(兼容空字符串、null、0、[] 等)
$savedTime = null;
if (!empty(trim($da1))) { // trim() 去除首尾空格,防止 " " 被误判为非空
$timestamp = strtotime($da1);
if ($timestamp !== false) {
$savedTime = date('h:i a', $timestamp); // 注意:末尾空格已移除,更规范
} else {
$savedTime = null; // 时间格式非法,仍作为空处理
}
}
⚠️ 关键注意事项
- 不要用 == "" 进行弱比较:$da1 == "" 在 $da1 === 0、$da1 === false 时也返回 true,极易引发误判;
- 避免复用原始变量:像 $da1 = date(...) 会覆盖原始值,丧失调试与验证能力;
- 始终校验 strtotime() 返回值:它对无效时间(如 "xyz")返回 false,直接传给 date() 将再次触发当前时间回退;
- !$da1 可用但需谨慎:在布尔上下文中,0、"0"、false、null、"" 均为 falsy,若业务允许 "0" 作为有效时间(极少见),则必须用 trim($da1) !== '' 替代。
? 最终集成示例(TCPDF 场景)
// 假设 $da1 来自 $_POST['time_field'] 或类似来源
$da1 = $_POST['time_field'] ?? '';
$savedTime = '';
if (!empty(trim($da1))) {
$ts = strtotime($da1);
if ($ts !== false) {
$savedTime = date('h:i a', $ts); // 输出如 "02:30 pm"
}
}
// 在 TCPDF 中使用:
$pdf->Cell(0, 10, 'Time: ' . ($savedTime ?: '-'), 0, 1);
此方案确保:
✅ 空/空白/无效时间 → 显示为空(或自定义占位符如 -);
✅ 有效时间字符串(如 "14:30"、"2:30 PM")→ 正确格式化为 12小时制;
✅ 代码可维护、无副作用、符合 PSR-12 规范。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











