Homestead环境下PHP的DateTime()与time()返回时间不一致问题
问题原因与解决办法
首先得给你掰扯清楚一个核心知识点:time()返回的是Unix时间戳,说白了就是从1970年1月1日UTC零点到现在的总秒数,这个值是完全与时区无关的绝对计数。而DateTime对象显示的是你设置的Europe/Brussels时区的本地时间,这俩本质上是同一个时间的不同表达形式——正常情况下,把DateTime对象转成时间戳,应该和time()的结果完全一致。如果出现不一致,大概率是下面这几种情况:
1. 你对时间戳的理解有偏差
可能你是直接把DateTime返回的本地时间(比如2018-03-25 23:27:43)手动转换成了时间戳,但没考虑时区,导致算出来的结果和time()对不上。举个例子:
// 错误操作:直接用本地字符串转,没指定时区 $wrongTimestamp = strtotime('2018-03-25 23:27:43'); // 正确操作:用DateTime自带的方法转 $dt = new DateTime(); $correctTimestamp = $dt->getTimestamp();
后者的结果肯定和time()完全一致,你可以试试。
2. PHP的时区配置没完全生效
虽然你改了cli和fpm的php.ini,但可能踩了这些坑:
- 改错了配置文件:先确认PHP实际加载的是哪个
php.ini——cli环境下执行php -i | grep "Loaded Configuration File",web环境下扔个phpinfo()页面看看,确保你修改的是正确的文件。 - 改完没重启服务:fpm环境下,改完
php.ini必须重启php-fpm服务才会生效;cli环境虽然是即时生效,但如果是在Homestead的ssh会话里改的,最好退出重新登录,确保环境变量刷新。 - 代码/框架覆盖了时区:比如代码里有
date_default_timezone_set()偷偷设了别的时区,或者像Laravel这类框架,config/app.php里的timezone配置项会覆盖php.ini的设置,得检查下。
3. 虚拟机系统时间不准(这个影响time()的根源)
time()的返回值是基于系统内核的UTC时间,所以系统时区不影响它,但如果系统时间本身就错了,那time()的结果肯定也不对。你可以先验证下:
# 查看系统的UTC时间 date -u # 在PHP里把time()转成UTC时间看看 echo date('Y-m-d H:i:s', time());
如果这俩对不上,说明虚拟机时间跑偏了,在Homestead里执行sudo ntpdate pool.ntp.org同步下网络时间就行。
快速排查验证代码
你可以在PHP里跑这段代码,对比所有结果:
$dt = new DateTime(); echo "DateTime本地时间: " . $dt->format('Y-m-d H:i:s') . "\n"; echo "DateTime对应的时间戳: " . $dt->getTimestamp() . "\n"; echo "time()返回的时间戳: " . time() . "\n"; echo "time()转成UTC时间: " . gmdate('Y-m-d H:i:s', time()) . "\n"; echo "DateTime转成UTC时间: " . $dt->setTimezone(new DateTimeZone('UTC'))->format('Y-m-d H:i:s') . "\n";
如果DateTime对应的时间戳和time()返回的时间戳一致,那说明根本没毛病,只是你之前对时间戳的理解错了;如果不一致,再按上面的配置问题逐一排查。
内容的提问来源于stack exchange,提问作者rvaliev
相关产品推荐
相关产品推荐

