PHP获取当前时间不对,时区设置date.timezone
时间:2026-10-9 07:28 作者:emer 分类: 无
前言
PHP用date()获取当前时间,结果比实际时间差了8个小时?这是最常见的时区问题。PHP默认用UTC时区,北京时间是东八区,所以差了8小时。本文讲怎么改。
一、问题现象
<?php
echo date('Y-m-d H:i:s');
输出:
2026-10-09 00:30:00
但实际北京时间是:
2026-10-09 08:30:00
差了8个小时。
二、原因
PHP默认时区是UTC(世界标准时间),不是北京时间。
北京时间是 UTC+8,所以差了8小时。
三、解决方法
方法1:改php.ini(推荐)
第一步:找到php.ini
php --ini
找到Loaded Configuration File那一行:
Loaded Configuration File: /etc/php.ini
第二步:修改date.timezone
打开php.ini,找到这行:
;date.timezone =
改成:
date.timezone = Asia/Shanghai
第三步:重启php-fpm
systemctl restart php-fpm
方法2:代码里设置(临时)
不想改php.ini,可以在代码里设:
<?php
date_default_timezone_set('Asia/Shanghai');
echo date('Y-m-d H:i:s');
注意: 要在所有日期函数之前设。
方法3:.htaccess里设
Apache的话,可以在.htaccess里设:
php_value date.timezone Asia/Shanghai
四、常用时区对照
| 时区 | 说明 |
|---|---|
| Asia/Shanghai | 北京时间(东八区) |
| Asia/Chongqing | 重庆时间 |
| Asia/Urumqi | 乌鲁木齐时间 |
| Asia/Hong_Kong | 香港时间 |
| Asia/Taipei | 台北时间 |
| Asia/Tokyo | 东京时间(东九区) |
| America/New_York | 纽约时间 |
| Europe/London | 伦敦时间 |
| UTC | 世界标准时间 |
国内用: Asia/Shanghai
五、验证时区
看当前时区
<?php
echo date_default_timezone_get();
// 输出:Asia/Shanghai
看服务器时间
date
看PHP时间
<?php
echo date('Y-m-d H:i:s');
对比一下,应该一样了。
六、常见坑
坑1:CLI和FPM时区不一样
命令行里改了php.ini,但网页上还是不对。
原因: CLI和FPM用不同的php.ini。
解决: 看phpinfo()里的配置路径,改对应的那个。
<?php
phpinfo();
搜"Loaded Configuration File",看用的哪个文件。
坑2:改了没重启
改了php.ini忘了重启php-fpm。
解决:
systemctl restart php-fpm
坑3:代码里又改回去了
某个框架或库里又调了 date_default_timezone_set('UTC')。
解决: 全局搜一下,看哪里改的。
坑4:用了gmdate()
gmdate()总是用UTC时区,不管你设什么。
比如:
echo gmdate('Y-m-d H:i:s');
这个输出的是UTC时间,不是北京时间。
解决: 用date()不要用gmdate(),或者自己加8小时。
坑5:数据库时间不对
PHP时区对了,但MySQL里的时间不对。
原因: MySQL自己也有时区设置。
解决: MySQL连接后设时区:
SET time_zone = '+8:00';
或者改my.cnf:
default-time-zone = '+8:00'
七、常用日期函数
获取当前时间
date_default_timezone_set('Asia/Shanghai');
// 当前日期时间
echo date('Y-m-d H:i:s');
// 今天
echo date('Y-m-d');
// 现在几点
echo date('H:i:s');
// 时间戳
echo time();
时间戳转日期
$time = time();
echo date('Y-m-d H:i:s', $time);
日期转时间戳
$str = '2026-10-09 08:30:00';
echo strtotime($str);
几天以后
// 3天后
echo date('Y-m-d', strtotime('+3 days'));
// 下周
echo date('Y-m-d', strtotime('next week'));
八、框架里的设置
ThinkPHP
在config/app.php里:
'default_timezone' => 'Asia/Shanghai',
Laravel
在config/app.php里:
'timezone' => 'Asia/Shanghai',
总结
记住:
- PHP默认UTC时区,差8小时
- 改php.ini里的
date.timezone = Asia/Shanghai - 改完重启php-fpm
- 或者代码里
date_default_timezone_set('Asia/Shanghai') - CLI和FPM可能用不同的php.ini
最常用:
date_default_timezone_set('Asia/Shanghai');
echo date('Y-m-d H:i:s');
遇到问题加QQ23979811 协助处理
标签: PHP 时区 php.ini date.timezone 时间设置