Node.js Lambda中MySQL查询datetime字段返回错误值的原因与解决
MySQL日期查询时区不一致问题的原因与解决方法
原因
- 核心是时区不匹配:MySQL里存的
2022-01-01 00:00:00是东八区(UTC+8)的本地时间,而Node.js返回的2021-12-31T16:00:00.000Z是UTC标准时间,两者刚好差8小时,属于时间的不同时区表示,并非数据存储错误。 - 另外,Node.js的MySQL驱动默认会把数据库返回的时间解析为UTC时间,如果连接时没有指定对应时区,就会出现这种显示差异。
解决方法
1. 连接数据库时指定时区
在创建连接池的配置中添加时区参数,直接让驱动按指定时区解析时间:
const pool = mysql.createPool({ host: '你的数据库地址', user: '用户名', password: '密码', database: '数据库名', timezone: 'Asia/Shanghai' // 或者直接写 '+08:00' });
2. SQL查询时直接转换时区
在SELECT语句里把日期转换为目标时区,避免后续处理:
SELECT CONVERT_TZ(START_DATE, @@session.time_zone, '+08:00') AS START_DATE FROM tablename;
如果数据库本身用的是UTC时区,就把第一个参数改成'UTC'。
3. 在Node.js代码中转换时区
拿到查询结果后,手动把UTC时间转成东八区时间:
// 转成本地字符串格式 const localDateStr = row.START_DATE.toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' }); // 转成ISO格式的东八区时间 const localIsoDate = new Date(row.START_DATE.getTime() + 8 * 60 * 60 * 1000).toISOString();
4. 统一数据库时区
修改MySQL的时区配置,让数据库和应用时区保持一致:
- 临时生效(重启后失效):
SET GLOBAL time_zone = '+08:00'; SET SESSION time_zone = '+08:00';
- 永久生效:修改MySQL配置文件(如my.cnf),添加
default-time-zone = '+08:00',然后重启MySQL服务。
内容的提问来源于stack exchange,提问作者Sumith Chalil
相关产品推荐
相关产品推荐

