如何将时间戳转换为可存入SQL DATETIME的日期时间格式?
解决JS时间戳转SQL DATETIME格式的问题
首先得纠正你代码里的一个小错误:new Date()是创建当前时间的对象,你应该把时间戳作为参数传给Date构造函数,也就是new Date(resetPasswordExpires),而toString()方法不需要参数——它只是把Date对象转成人类可读的字符串,但这个格式确实不兼容SQL的DATETIME类型。
SQL的DATETIME列需要的是YYYY-MM-DD HH:mm:ss这样的标准格式,下面给你几种可靠的转换方法:
方法1:利用toISOString()快速转换
toISOString()会生成YYYY-MM-DDTHH:mm:ss.sssZ格式的字符串,我们只需要截取前19位,再把T替换成空格就能得到SQL兼容的格式:
const resetPasswordExpires = 1524133033085; const date = new Date(resetPasswordExpires); const sqlDateTime = date.toISOString().slice(0, 19).replace('T', ' '); // 结果:"2018-04-19 09:21:02"(注意这里是UTC时间,如果你需要本地时区的时间,看方法2)
方法2:手动拼接本地时区的日期时间
如果你需要用服务器/客户端的本地时区而不是UTC,就手动获取年、月、日等部分,补零后拼接:
const resetPasswordExpires = 1524133033085; const date = new Date(resetPasswordExpires); // 注意月份是从0开始的,所以要+1 const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); const seconds = String(date.getSeconds()).padStart(2, '0'); const sqlDateTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; // 结果:"2018-04-19 12:21:02"(和你之前toString的本地时区一致)
重要提醒:避免SQL注入!
千万不要直接把格式化后的字符串拼到SQL语句里(像你示例里那样),这会导致严重的SQL注入风险。正确的做法是用参数化查询,比如在Node.js的mysql库中,你可以这样写:
// 假设db是你的数据库连接对象 const updateQuery = `UPDATE User SET resetPasswordToken = ?, resetPasswordExpires = ? WHERE id = ?`; const values = ['c2d313284f6de68cc1f18e3c45b0ea2c720220f0', sqlDateTime, userId]; db.query(updateQuery, values, (err, result) => { // 处理结果 });
参数化查询会自动处理格式转义和安全问题,比手动拼接字符串安全得多。
内容的提问来源于stack exchange,提问作者devRena
相关产品推荐
相关产品推荐

