PHP按Y-m-d\TH:i:s.v\Z格式化日期正常但解析失败求助
关于PHP 7.x解析JavaScript toISOString格式日期的问题
我来帮你拆解这个问题哈~你遇到的情况其实是PHP 7.0到7.2版本对JavaScript toISOString()输出的YYYY-MM-DDTHH:mm:ss.sssZ格式支持不完善导致的。
问题原因
在PHP 7.x的早期版本中,日期解析器对**毫秒部分(.sss)和UTC时区标识Z**的组合处理存在兼容性bug,无法正确识别这种格式的字符串,所以调用DateTime::createFromFormat或者直接new DateTime()时会返回false,而不是预期的DateTime实例。
解决方案
根据你的PHP版本,有几种可行的处理方式:
1. 通用兼容方案(所有PHP 7.x版本可用)
最简单的方法是把字符串里的Z替换为+00:00(UTC时区的标准偏移格式),PHP的日期解析器对这种格式的支持更稳定:
$jsDateStr = '2011-10-05T14:48:00.000Z'; // 替换Z为UTC偏移格式 $adjustedStr = str_replace('Z', '+00:00', $jsDateStr); $date = new DateTime($adjustedStr); // 验证输出 var_dump($date); // 现在会返回DateTime实例
2. 保留毫秒的处理方式
如果需要保留日期中的毫秒信息,可以分版本处理:
- PHP 7.1及以上版本:
PHP 7.1开始支持v作为毫秒的占位符,直接用createFromFormat指定正确格式即可:$jsDateStr = '2011-10-05T14:48:00.123Z'; $date = DateTime::createFromFormat('Y-m-d\TH:i:s.v\Z', $jsDateStr); - PHP 7.0版本:
因为7.0不支持v占位符,需要用正则提取毫秒部分,再手动添加到DateTime对象中:$jsDateStr = '2011-10-05T14:48:00.123Z'; // 正则匹配日期主体和毫秒部分 preg_match('/^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})\.(\d{3})Z$/', $jsDateStr, $matches); // 解析日期主体(替换Z为+00:00) $date = new DateTime($matches[1] . '+00:00'); // 添加毫秒 $date->modify("+{$matches[2]} milliseconds");
补充说明
PHP 7.3及以后的版本已经修复了这个解析bug,直接使用new DateTime('2011-10-05T14:48:00.000Z')就能正常解析,如果你有升级PHP版本的条件,这也是一劳永逸的解决办法。
内容的提问来源于stack exchange,提问作者ganchito55
相关产品推荐
相关产品推荐

