From 8cda4c1a0bb1169f8cfc0edb311d03e75cf7f791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=BB=E5=8B=87=E7=A5=A5?= <237899745@qq.com> Date: Fri, 14 Nov 2025 16:46:26 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=97=B6=E5=8C=BA?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20-=20=E4=BD=BF=E7=94=A8=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E6=97=B6=E5=8C=BA=E5=AD=98=E5=82=A8=E5=92=8C=E6=AF=94=E8=BE=83?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 问题 - 之前使用UTC时间存储expires_at - 前端解析时当成本地时间,导致显示时间差8小时 - 例如: 数据库存 08:37 (UTC),前端显示 08:37 (本地),实际应该显示 16:37 ## 修复 1. database.js create方法: 使用本地时区格式化时间 - 使用 getFullYear/getMonth/getDate 等获取本地时间 - 格式化为 YYYY-MM-DD HH:MM:SS (本地时间) 2. database.js findByCode方法: 使用本地时区比较 - 改为 datetime('now', 'localtime') - 确保与存储的本地时间格式匹配 3. 调试日志也使用本地时区 ## 效果 - 创建分享时,expires_at存储的是服务器本地时间 - 前端显示时间与服务器时间一致 - 过期判断使用本地时区,结果正确 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- backend/database.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/backend/database.js b/backend/database.js index 10c88b0..590f354 100644 --- a/backend/database.js +++ b/backend/database.js @@ -303,9 +303,15 @@ const ShareDB = { if (expiry_days) { const expireDate = new Date(); expireDate.setDate(expireDate.getDate() + parseInt(expiry_days)); - // 转换为SQLite datetime格式 (YYYY-MM-DD HH:MM:SS),而不是ISO格式 - // 这样才能正确与 datetime('now') 进行比较 - expiresAt = expireDate.toISOString().replace('T', ' ').replace(/\.\d+Z$/, ''); + // 使用本地时区时间,而不是UTC时间 + // 这样前端解析时会正确显示为本地时间 + const year = expireDate.getFullYear(); + const month = String(expireDate.getMonth() + 1).padStart(2, '0'); + const day = String(expireDate.getDate()).padStart(2, '0'); + const hours = String(expireDate.getHours()).padStart(2, '0'); + const minutes = String(expireDate.getMinutes()).padStart(2, '0'); + const seconds = String(expireDate.getSeconds()).padStart(2, '0'); + expiresAt = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } const stmt = db.prepare(` @@ -336,7 +342,7 @@ const ShareDB = { // 根据分享码查找 findByCode(shareCode) { // 调试日志: findByCode 调用 - const currentTime = db.prepare("SELECT datetime('now') as now").get(); + const currentTime = db.prepare("SELECT datetime('now', 'localtime') as now").get(); console.log('[ShareDB.findByCode]', { shareCode, currentTime: currentTime.now, @@ -348,7 +354,7 @@ const ShareDB = { FROM shares s JOIN users u ON s.user_id = u.id WHERE s.share_code = ? - AND (s.expires_at IS NULL OR s.expires_at > datetime('now')) + AND (s.expires_at IS NULL OR s.expires_at > datetime('now', 'localtime')) `).get(shareCode); // 调试日志: SQL查询结果