
在 InfinityFree 等共享主机上,PHP 默认时区与 MySQL 服务器时区往往不一致(通常为 UTC),导致从数据库读取的时间显示错误;可通过 date_default_timezone_set() 统一 PHP 时区,并配合 SQL SET time_zone 指令同步 MySQL 会话时区,确保前后端时间显示一致。
在 infinityfree 等免费共享主机上,php 默认时区与 mysql 服务器时区往往不一致(通常为 utc),导致从数据库读取的时间显示错误;可通过 `date_default_timezone_set()` 统一 php 时区,并配合 sql `set time_zone` 指令同步 mysql 会话时区,确保前后端时间显示一致。
InfinityFree 平台默认将服务器系统时区设为 UTC,且不支持修改全局 MySQL 时区或 PHP 配置文件(如 php.ini)。因此,必须在应用层主动协调 PHP 和 MySQL 的时区行为,否则即使数据库中存储的是 DATETIME 类型的本地时间,查询结果也会被按服务器时区解析,造成“时间偏移”。
✅ 两步法确保时区统一:
-
设置 PHP 默认时区(影响 date()、strtotime()、DateTime 等函数)
在脚本开头(建议在数据库连接前)调用:date_default_timezone_set('Asia/Kolkata'); // 印度标准时间(UTC+5:30) -
为当前 MySQL 连接显式设置会话时区(影响 NOW()、CURTIME() 及 DATETIME 字段读写行为)
在建立数据库连接后,立即执行:$mysqli->query("SET time_zone = '+05:30'"); // 推荐使用 UTC 偏移量,兼容性更高 // 或使用命名时区(需 MySQL 支持,InfinityFree 通常支持常见时区名): // $mysqli->query("SET time_zone = 'Asia/Kolkata'");
⚠️ 注意事项:
- date_default_timezone_set() 仅影响 PHP 内部时间函数,不影响 MySQL 查询结果的时区解释;反之,SET time_zone 仅作用于当前数据库连接,对 PHP 时间函数无影响。二者必须配合使用。
- 使用 '+05:30' 比 'Asia/Kolkata' 更可靠——InfinityFree 的 MySQL 时区表(mysql.time_zone)可能未完全加载,而 UTC 偏移量无需依赖时区表。
- 若使用 PDO,请在 PDO::exec() 中执行 SET time_zone;若使用 WordPress 或 Laravel 等框架,请在数据库初始化逻辑中注入该语句。
- 数据库存储建议:始终以 UTC 存储时间戳(TIMESTAMP 类型自动转换),并在展示前用 PHP 转换为用户本地时区,可从根本上避免时区耦合问题。
总结:在受限环境中,主动控制而非依赖服务器配置是关键。通过 date_default_timezone_set() + SET time_zone 组合,即可精准还原“用户期望看到的时间”,无需升级主机或修改底层设置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











