从数据库获取日期时Backend显示少1天的问题求助
问题解决:数据库日期与后端返回日期偏移1天
核心原因
你的数据库date_of_birth是DATE类型(仅存储年月日,无时区信息),但Node.js的mysql驱动默认会将数据库的DATE值转换为UTC时区的ISO时间戳。比如你的本地时区是UTC-3,数据库里的2023-12-29会被驱动转成UTC时间2023-12-28T21:00:00.000Z,前端用UTC格式化后自然显示成前一天。
解决方案(任选其一即可)
方案1:修改数据库连接的时区配置
在创建MySQL连接时,指定timezone参数为本地时区,让驱动直接按本地时区解析日期:
const db = mysql.createConnection({ host:"localhost", user: "root", password: "Asd-DWEG3", database: "students", timezone: 'local' // 新增该行,使用服务器本地时区 // 也可以指定具体时区,比如 '+03:00' 或者 'Asia/Shanghai' })
修改后,后端返回的date_of_birth会是正确的本地日期对应的ISO时间(比如2023-12-29T00:00:00.000+03:00),前端格式化时就能显示正确日期。
方案2:在SQL查询中直接返回格式化后的日期字符串
避免驱动自动转换时间,直接在查询时将DATE字段转为字符串返回:
SELECT student_id, first_name, last_name, department, DATE_FORMAT(date_of_birth, '%Y-%m-%d') AS date_of_birth FROM student;
修改后端的GET接口查询语句,这样返回的date_of_birth就是纯字符串"2023-12-29",前端无需额外处理时区问题。
方案3:调整前端日期格式化逻辑
如果不想修改后端,前端可以将UTC时间戳转换为本地日期后再格式化,去掉timeZone: 'UTC'配置:
const formatDate = (dateString) => { const formattedDate = new Date(dateString).toLocaleDateString('en-GB', { year: 'numeric', month: 'short', day: '2-digit' // 移除timeZone: 'UTC',默认使用本地时区 }); return formattedDate; };
这样前端会把UTC时间戳转换为本地时区的日期,显示正确的29 Dec 2023。
为什么你之前修改MySQL时区没用?
MySQL的SYSTEM时区跟随服务器系统时区,但Node.js的mysql驱动默认忽略MySQL时区,强制使用UTC解析日期,所以修改MySQL时区不会改变驱动的转换逻辑,必须在驱动连接配置中指定时区才有效。
内容的提问来源于stack exchange,提问作者SaxtonNova
相关产品推荐
相关产品推荐

