使用PHP将日期存储到MySQL时出现日期格式不匹配(月日颠倒)问题
解决MySQL存储日期时月日颠倒的问题
这个问题我之前踩过一模一样的坑!核心原因是strtotime()的解析规则在搞鬼:当你用横杠分隔的日期格式(比如m-d-Y)时,它会默认按照欧洲地区的日期习惯(d-m-Y,日-月-年)来解析,而不是你预期的美式格式(月-日-年)。所以你表单里的08-09-2021(8月9日),被它当成了9月8日,自然输出就颠倒了。
下面给你三种可靠的解决方案,按需选择:
方案一:修改前端日期格式为斜杠分隔(最简单)
strtotime()对斜杠分隔的m/d/Y格式识别是准确的,直接修改event.php里的日期输出格式:
<input type="text" name="registraionDate" id="datepicker" value="<?php print date('m/d/Y H:i'); ?>">
这样表单会显示08/09/2021 14:14,后端用原来的代码处理时,strtotime()就能正确解析成8月9日,输出2021-08-09 14:14:00。
方案二:用DateTime类手动指定解析格式(最推荐,最稳定)
如果不想改前端格式,用PHP的DateTime类可以精准指定输入格式,完全避免自动解析的歧义。修改event-process.php的代码:
$registraionDate = $_POST['registraionDate']; // 严格按照前端输出的m-d-Y H:i格式解析 $dateObj = DateTime::createFromFormat('m-d-Y H:i', $registraionDate); // 输出MySQL兼容的Y-m-d H:i:s格式 print $dateObj->format('Y-m-d H:i:s');
这种方法不受任何地区解析规则的影响,不管你用什么分隔符,只要指定对格式就不会出错,适合长期维护的项目。
方案三:用原生datetime-local输入框(体验更好)
如果你的目标浏览器兼容性允许(现代浏览器都支持),可以把输入框改成原生的日期时间选择器,它输出的格式更标准,后端处理更省心:
<input type="datetime-local" name="registraionDate" id="datepicker" value="<?php print date('Y-m-d\TH:i'); ?>">
后端接收后只需要把格式里的T替换成空格,再补秒即可:
$registraionDate = str_replace('T', ' ', $_POST['registraionDate']); print $registraionDate . ':00';
这种方式还能避免用户手动输入错误的日期格式,提升表单体验。
内容的提问来源于stack exchange,提问作者Balaji
相关产品推荐
相关产品推荐

