NodeJS-MySQL项目查询graduates表返回时间与库内存储时区不一致如何解决
问题原因
- Node.js的MySQL驱动默认会将查询返回的DATETIME类型字段自动转换为JavaScript原生Date对象,而JS Date对象内部存储的是UTC时间戳,直接序列化为JSON时会默认输出带
Z后缀的UTC 0时区时间,和MySQL中存储的圣保罗时区字符串不一致。 - 原有moment配置方式错误,
moment().tz("America/Sao_Paulo").format()仅生成了当前时间的格式化字符串,既没有全局设置moment的默认时区,也没有对GET接口返回的时间字段做主动转换处理,因此配置不生效。
解决方案
提供两种可直接落地的方案,按需选择即可:
方案1:修改MySQL连接配置(最简便)
在创建MySQL连接的配置项中新增dateStrings: true参数,强制驱动将DATETIME字段以原始字符串形式返回,和MySQL命令行中查询的结果完全一致,无需额外处理时间:
// 示例mysql2连接配置 const mysql = require('mysql2/promise'); const conn = await mysql.createConnection({ host: '你的数据库地址', user: '数据库用户名', password: '数据库密码', database: '数据库名', dateStrings: true // 新增这行配置 });
配置完成后GET接口直接返回graduate.created_at即可得到圣保罗时区的时间字符串。
方案2:主动用moment转换查询返回的时间字段
如果需要保留Date对象的操作能力,可以在GET接口的处理逻辑中,对时间字段做时区转换后再返回:
首先修改moment的全局时区配置,将原来的配置替换为全局设置:
const moment = require('moment-timezone'); // 全局设置默认时区为圣保罗,代替原有临时格式化代码 moment.tz.setDefault("America/Sao_Paulo");
然后修改GET接口的返回逻辑,对时间字段做转换:
const response = { length: result.length, graduates: result.map(graduate => { return { id: graduate.id, nomeGrad: graduate.nomeGrad, description: graduate.description, created_at: moment(graduate.created_at).format('YYYY-MM-DD HH:mm:ss'), updated_at: moment(graduate.updated_at).format('YYYY-MM-DD HH:mm:ss') } }) }
内容的提问来源于stack exchange,提问作者André Medeiros
相关产品推荐
相关产品推荐

