数值格式下MySQL与PHP输出UTC时间存在2小时差问题求助
问题根因分析
- strtotime时区解析错误
你从MySQL取出的date_utc是UTC时区的时间字符串,但PHP的strtotime()函数默认会使用PHP配置的本地时区(你的环境应该是东二区,比UTC快2小时)来解析这个字符串,相当于把本是UTC的2021-09-23 09:54:06当成了东二区的时间转时间戳,转换后自然就比实际UTC时间对应的时间戳少了7200秒。 - gmdate调用参数错误
gmdate()的第一个参数必须是格式字符串,你直接传time()作为第一个参数属于语法错误,这里你本意是获取当前UTC时间对应的时间戳,直接用time()就可以,不需要套gmdate。time()函数返回的本身就是当前的Unix时间戳,和时区无关,你用gmdate(time())得到的结果是不符合预期的错误值,本次输出看似是时间戳属于巧合。 - MySQL写入时间的函数使用错误
UTC_TIME()仅返回UTC时区的时分秒部分,不会携带日期,写入DATETIME字段时MySQL会自动补全默认日期,虽然本次测试输出日期正常,但生产环境很容易出现日期异常,正确应该用UTC_TIMESTAMP()获取完整的UTC日期时间。
修复方案
1. 修正PHP时区解析逻辑
全流程用UTC时间的场景,推荐直接全局设置PHP默认时区为UTC,彻底避免解析偏差:
date_default_timezone_set('UTC');
如果不想改全局配置,也可以在转时间戳时给字符串拼接UTC后缀,指定按UTC时区解析:
$utcTimestamp = strtotime($user['date_utc'] . ' UTC');
2. 修正时间戳获取写法
获取当前Unix时间戳直接用time()即可,调整调试输出代码:
// 错误写法 // echo gmdate(time()); // 正确写法 echo time(); // 差值计算调整为 echo strtotime($user['date_utc']) - time();
3. 修正MySQL写入时间的函数
把更新语句里的UTC_TIME()改成UTC_TIMESTAMP():
$query = ' update datetests set date_utc = UTC_TIMESTAMP() where id = '.$id.' ;';
补充说明
Unix时间戳本身与时区无关,定义就是从1970-01-01 00:00:00 UTC到现在的秒数,你全流程统一用UTC时间的逻辑是正确的,只要保证「存储的是UTC时间字符串、解析字符串时按UTC时区解析、时间戳直接用time()获取」三个点,就不会出现时区差值问题。
内容的提问来源于stack exchange,提问作者Soulss
相关产品推荐
相关产品推荐

