You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:24:43