使用NOW()保存DATETIME到数据库时默认时区异常问题
解决MySQL NOW()存储时区与PHP不一致的问题
这问题我踩过好几次坑了!核心原因就是PHP的时区和MySQL的时区没同步——你已经把服务器PHP时区设成Asia/Kolkata了,所以用date("Y-m-d H:i:s")输出的时间是对的,但MySQL自己的时区还停留在UTC或者其他时区,导致NOW()存的时间差了好几个小时。
第一步:先确认MySQL当前时区
先跑个SQL命令查一下:
SELECT @@global.time_zone, @@session.time_zone;
你大概率会看到结果是SYSTEM或者UTC,这就是问题根源——MySQL用的时区和PHP的Asia/Kolkata不匹配,自然存的时间就不对。
第二步:修复MySQL时区
有两种方式,按需选择:
方式1:临时生效(重启MySQL后失效,适合快速测试)
- 如果有超级权限,先全局设置MySQL时区:
SET GLOBAL time_zone = 'Asia/Kolkata'; - 然后给当前会话也设置一下(不然当前连接还是老时区):
注意:全局设置后,新建立的数据库连接才会生效,现有连接需要重新断开再连。SET time_zone = 'Asia/Kolkata';
方式2:永久生效(修改配置文件,一劳永逸)
找到MySQL的配置文件:
- Linux系统一般是
/etc/my.cnf或者/etc/mysql/my.cnf - Windows系统一般是
my.ini(在MySQL安装目录下)
打开文件后,在[mysqld]段落里添加一行:
default-time-zone = 'Asia/Kolkata'
保存后重启MySQL服务,这样每次MySQL启动都会自动加载正确的时区,再也不用手动设置了。
备选方案:绕开MySQL时区问题
如果暂时没法修改MySQL配置,也可以直接用PHP生成的时间插入数据库,比如:
$dt2 = date("Y-m-d H:i:s"); // 插入时直接用$dt2代替NOW() $sql = "INSERT INTO your_table (dtime) VALUES ('$dt2')";
这样直接把PHP已经处理好的正确时间存进去,也能解决问题,但长远来看还是把MySQL和PHP的时区统一更稳妥。
内容的提问来源于stack exchange,提问作者meenal
相关产品推荐
相关产品推荐

