PHP 7.2.5时区显示异常:选美洲时区却返回Europe/Berlin
解决PHP 7.2.5时区始终返回Europe/Berlin的问题
先直接给你结论:默认经纬度的设置和你遇到的问题完全无关——你已经把date.default_latitude和date.default_longitude这两个配置注释掉了,PHP根本不会读取它们。而且这俩配置本来就只用来计算日出日落这类天文时间,和时区的选择没有半毛钱关系。
咱们一步步排查真正的原因:
1. 先确认php.ini配置是否真的生效
很多时候我们以为改了配置,但实际上PHP用的是另一个配置文件(比如Web服务器用的php.ini和CLI命令行用的不是同一个)。你可以做个简单的测试:
创建一个test_timezone.php文件,内容如下:
<?php // 查看php.ini里配置的时区 echo "配置文件中设置的时区:" . ini_get('date.timezone') . "\n"; // 查看PHP当前实际使用的时区 echo "当前实际生效的时区:" . date_default_timezone_get() . "\n"; // 输出当前时间,直观验证 echo "当前时间:" . date('Y-m-d H:i:s') . "\n"; ?>
运行这个文件(Web环境就访问它,CLI环境直接执行php test_timezone.php),看两个时区输出是否一致:
- 如果
ini_get('date.timezone')返回的不是America/New_York,说明你修改的php.ini不是PHP实际加载的那个。可以通过phpinfo()查看Loaded Configuration File项,找到真正生效的配置文件路径。 - 如果
ini_get结果正确,但date_default_timezone_get()返回Europe/Berlin,那肯定是代码里被强制覆盖了。
2. 排查代码或框架的时区覆盖
检查你的项目代码里有没有用date_default_timezone_set()函数手动设置时区,比如:
- 框架的全局配置文件(比如各类框架的初始化配置项)
- 项目入口文件(如index.php)
- 第三方依赖库的初始化代码
有些时候可能是某个依赖包不小心硬编码了date_default_timezone_set('Europe/Berlin'),导致不管你php.ini怎么设置都会被覆盖。
3. 检查服务器环境变量
如果上面两步都没问题,那看看服务器的TZ环境变量是不是被设置成了Europe/Berlin。PHP在某些情况下会优先读取系统的TZ环境变量,忽略php.ini的配置。你可以在phpinfo的Environment部分找到TZ项,查看它的值。
总结一下:先通过测试代码定位是配置没生效、代码被覆盖,还是系统环境变量的问题,和经纬度完全没关系~
内容的提问来源于stack exchange,提问作者David Hahn




