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

如何将日期转换为Y-m-d格式?解决PHP中strtotime处理GMT日期返回1970-01-01的问题

解决日期转换为Y-m-d格式的问题

嘿,我来帮你搞定这个日期转换的坑!

首先说为什么你的代码会输出1970-01-01:你的日期字符串Thu Jul 01 2021 15:22:00 GMT 0300 (Eastern European Summer Time)里,末尾的(Eastern European Summer Time)部分让strtotime()无法正确解析整个字符串,导致它返回了false。而date()函数会把false当作Unix时间戳0来处理,也就是纪元起始日期1970-01-01。

针对你的问题的修复方案

这里有两种可靠的解决办法:

方法1:清理日期字符串后再解析

先把末尾的括号和里面的时区名称去掉,让strtotime()能识别剩下的标准格式:

$date = 'Thu Jul 01 2021 15:22:00 GMT 0300 (Eastern European Summer Time)';
// 正则去掉末尾的 (xxx) 部分
$cleanDate = preg_replace('/\s\(.*\)$/', '', $date);
$from = date('Y-m-d', strtotime($cleanDate));
echo $from; // 输出 2021-07-01

方法2:使用DateTime类(更推荐)

DateTime类的解析能力比strtotime()强很多,我们可以直接指定格式来解析:

$dateStr = 'Thu Jul 01 2021 15:22:00 GMT 0300 (Eastern European Summer Time)';
// 定义匹配的格式:D(星期缩写)、M(月份缩写)、d(日)、Y(年)、H:i:s(时分秒)、T(时区缩写)、O(时区偏移)
$date = DateTime::createFromFormat('D M d Y H:i:s T O', $dateStr);
if ($date) {
    echo $date->format('Y-m-d'); // 输出 2021-07-01
} else {
    echo '日期解析失败';
}

通用的日期转Y-m-d格式方法

根据日期字符串的格式不同,我们可以用不同的方式处理:

1. 标准格式的日期字符串

如果你的日期是PHP能自动识别的标准格式(比如2021-07-01、Jul 01 2021、2021/07/01等),直接用DateTime或者strtotime都可以:

// 用DateTime(推荐)
$date = new DateTime('2021-07-01');
echo $date->format('Y-m-d');

// 用strtotime
echo date('Y-m-d', strtotime('Jul 01 2021'));

2. 自定义格式的日期字符串

如果是自定义格式(比如01/07/2021这种日/月/年的格式),必须用DateTime::createFromFormat指定解析规则,避免歧义:

$dateStr = '01/07/2021';
// 指定格式为 日/月/年
$date = DateTime::createFromFormat('d/m/Y', $dateStr);
if ($date) {
    echo $date->format('Y-m-d'); // 输出 2021-07-01
} else {
    echo '日期格式不正确';
}

注意事项

  • 优先使用DateTime类:它支持更多格式,处理时区更方便,而且面向对象的方式更易维护。
  • 处理非标准格式时一定要指定解析格式:比如01/02/2021这种字符串,不指定格式的话PHP可能会把它当成月/日/年,导致转换错误。

内容的提问来源于stack exchange,提问作者chris227

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:47:49