
本文讲解如何通过 php 正确解析和格式化 html 表单中提交的日期字符串,避免因时间戳错误(如默认回退到 unix 纪元 1970-01-01)导致显示异常,并提供安全、健壮的日期处理方案。
本文讲解如何通过 php 正确解析和格式化 html 表单中提交的日期字符串,避免因时间戳错误(如默认回退到 unix 纪元 1970-01-01)导致显示异常,并提供安全、健壮的日期处理方案。
在 Web 表单中接收用户选择的日期时,一个常见误区是直接对未校验的 $_POST 值调用 strtotime() —— 若输入为空、格式非法或时区未明确,strtotime() 将返回 false,而 date() 函数会将其解释为 0 秒(即 1970-01-01 00:00:00 UTC),最终输出类似 Thursday, 01-Jan-70 的错误结果。
✅ 正确做法:验证 + 安全转换
首先确保表单字段存在且非空,并使用 DateTime 类(推荐)或增强型 strtotime() 校验:
if (isset($_POST['dateSend']) && !empty(trim($_POST['dateSend']))) {
$dateValue = trim($_POST['dateSend']);
// 方法一:使用 DateTime(更可靠,支持多种格式和时区)
$dateTime = DateTime::createFromFormat('Y-m-d', $dateValue);
if ($dateTime && $dateTime->format('Y-m-d') === $dateValue) {
$day = $dateTime->format('l, d-M-y'); // 例如:Thursday, 01-Jan-24
} else {
// 格式不匹配,可回退或报错
$day = 'Invalid date format. Expected YYYY-MM-DD.';
}
}
? 说明:HTML 默认提交格式为 YYYY-MM-DD(如 2024-01-01)。因此应优先按此格式解析,而非依赖 strtotime() 的模糊匹配(它对 01-Jan-70 这类格式虽能解析,但易受本地化影响)。
⚠️ 注意事项
- ❌ 避免 isset($_POST['dateSend']) 后直接赋值而不检查内容:空字符串或空格会导致 strtotime('') 返回 false;
- ❌ 不要省略时区设置:若需跨时区一致性,建议显式设定时区,例如 $dateTime->setTimezone(new DateTimeZone('Asia/Shanghai'));;
- ✅ 推荐前端配合使用 ,后端严格按 Y-m-d 解析,杜绝歧义;
- ✅ 如需兼容其他格式(如 d/m/Y),应先标准化再解析,或使用 date_parse_from_format()。
✅ 最小可用示例(含 HTML)
<!-- 前端表单 -->
<!-- 后端处理 -->
<?php if ($_POST && isset($_POST['dateSend']) && preg_match('/^\d{4}-\d{2}-\d{2}$/', $_POST['dateSend'])) {
$date = new DateTime($_POST['dateSend']);
echo '<p>Formatted date: ' . $date->format('l, d-M-y') . '';
} else {
echo '<p>Please select a valid date.</p>';
}
?>
通过结构化验证与现代日期类的结合,你不仅能准确获取用户选择的“实际日期”,还能提升代码健壮性与可维护性。










