
本文讲解如何通过php安全、准确地处理表单提交的日期字符串,避免出现“thursday, 01-jan-70”等unix纪元起始错误日期,并正确转换为可读格式。
本文讲解如何通过php安全、准确地处理表单提交的日期字符串,避免出现“thursday, 01-jan-70”等unix纪元起始错误日期,并正确转换为可读格式。
在Web开发中,常见误区是直接对未校验的 $_POST 值调用 strtotime() —— 若输入为空、格式非法或时区异常,strtotime() 将返回 false,而 date() 函数会将其解释为 Unix 时间戳 0(即 1970-01-01 00:00:00 UTC),最终输出类似 Thursday, 01-Jan-70 的错误结果。
要真正获取用户选择的“实际日期”,需遵循以下三步原则:
✅ 1. 先验证输入存在且非空
仅用 isset() 不够,因为若表单字段为空提交,$_POST['dateSend'] 可能为 ''(空字符串),strtotime('') 同样返回 false。应结合 !empty() 或严格判断:
if (!empty($_POST['dateSend'])) {
$dateValue = trim($_POST['dateSend']);
} else {
die('错误:日期未填写或格式无效');
}
✅ 2. 使用兼容性强的日期格式(推荐 ISO 8601)
确保前端 的值为 YYYY-MM-DD 格式(如 2024-05-20),这是 strtotime() 和 DateTime 类最可靠解析的格式:
<input type="date" name="dateSend" required>
✅ 3. 安全转换并格式化(推荐使用 DateTime 类)
相比 date() + strtotime() 组合,DateTime 更健壮,支持错误检测和时区控制:
$dateValue = $_POST['dateSend'] ?? '';
$dateTime = DateTime::createFromFormat('Y-m-d', $dateValue);
if (!$dateTime || $dateTime->format('Y-m-d') !== $dateValue) {
die('错误:日期格式不合法,请使用 YYYY-MM-DD 格式');
}
// 输出为 "Monday, 20-May-24"(注意:'y' 是两位年份;如需四位年份请用 'Y')
$day = $dateTime->format('l, d-M-y');
echo $day; // 示例输出:Monday, 20-May-24
⚠️ 注意事项:
- 避免直接使用 date('D, d-M-y', strtotime($dateValue)):'D' 返回缩写星期(如 Thu),而 'l'(小写L)才返回完整名称(如 Thursday);原问题中标题用 Thursday,答案却用 'D',易导致不一致。
- 服务端务必校验日期有效性,不可依赖前端限制(如 required 或 type="date" 可被绕过)。
- 如需国际化显示(如中文星期/月份),建议使用 IntlDateFormatter 或 setlocale() 配合 strftime()(注意:strftime() 在 PHP 8.1+ 已废弃,推荐 IntlDateFormatter)。
总结:获取“实际日期”的核心不是语法技巧,而是输入验证 → 格式标准化 → 安全解析 → 显式错误处理。抛弃对 strtotime() 的盲目信任,拥抱 DateTime 类,才能让日期逻辑真正可靠。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











