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

从数据库获取日期时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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:45:58