You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP日期格式化时月份与日期位置颠倒问题求助

PHP日期格式化时月份与日期位置颠倒问题求助

嘿,我太懂你遇到这个日期格式搞反问题的郁闷了!咱们来一步步捋清楚问题出在哪,以及怎么解决它。

问题根源分析

你现在的代码逻辑是先把$myDate转成m-d-Y 00:00:00格式,接着又用strtotime()去解析这个字符串,再转成MySQL需要的Y-m-d 00:00:00格式。问题就出在strtotime()对m-d-Y格式的解析歧义上:

strtotime()在处理横杠分隔的日期(比如03-10-2023)时,会默认按照部分地区的习惯(日-月-年)来解析,所以它会把03-10-2023当成10月3日,而不是你预期的3月10日。后续再转成Y-m-d格式时,自然就变成了2023-10-03,完全搞反了月份和日期的位置。

可靠的解决方案

推荐用DateTime类来处理日期,它可以明确指定解析格式,彻底避免strtotime()的歧义问题,这也是PHP处理日期的最佳实践:

// 假设原始$myDate的格式是m-d-Y(比如03-10-2023)
$dateObj = DateTime::createFromFormat('m-d-Y', $myDate);
// 生成MySQL需要的Y-m-d格式日期
$mysqlstart = $dateObj->format('Y-m-d 00:00:00');
// 生成用于展示的m-d-Y格式日期
$displayDate = $dateObj->format('m-d-Y 00:00:00');

if($debugs) {
    echo "<br>myDate is: $displayDate in line: ".__LINE__."<br>";
    echo "<br>mysqlstart is: $mysqlstart in line: ".__LINE__."<br>";
}

这段代码里,我们明确告诉PHP要按照m-d-Y的格式解析原始日期,所以不会出现解析错误,生成的两种格式日期也完全符合预期。

备选方案(如果坚持用strtotime)

如果你暂时不想改用DateTime类,可以把中间的日期分隔符改成斜杠/,因为strtotime()对斜杠分隔的日期(比如03/10/2023)会默认按照月-日-年的规则解析:

$displayDate = date('m/d/Y 00:00:00', strtotime($myDate));
$mysqlstart = date('Y-m-d 00:00:00', strtotime($displayDate));

if($debugs) {
    echo "<br>myDate is: ".str_replace('/', '-', $displayDate)." in line: ".__LINE__."<br>";
    echo "<br>mysqlstart is: $mysqlstart in line: ".__LINE__."<br>";
}

不过这种方法依赖strtotime()的解析规则,不如DateTime类稳定,还是更推荐前者。

调试小技巧

以后遇到日期解析问题,可以先输出strtotime()返回的时间戳,看看它解析出来的时间是否正确:

echo "<br>解析后的时间戳: ".strtotime($myDate)."<br>";

把时间戳转成日期就能快速判断是不是解析环节出了问题。

备注:内容来源于stack exchange,提问作者WebDawg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 09:32:34