如何将日期转换为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
相关产品推荐
相关产品推荐

