From 6eae292922ff491e4731315bcebc77fb97c17659 Mon Sep 17 00:00:00 2001 From: shaw Date: Wed, 30 Jul 2025 11:01:51 +0800 Subject: [PATCH] =?UTF-8?q?fix(admin-spa):=20=E4=BF=AE=E6=AD=A3=E6=97=B6?= =?UTF-8?q?=E5=8C=BA=E8=AE=A1=E7=AE=97=E5=8F=8C=E9=87=8D=E5=81=8F=E7=A7=BB?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重写getSystemTimezoneDay函数,修复之前的双重偏移错误 - 简化时间计算逻辑,直接使用Date.UTC创建系统时区时间 - 移除不必要的getDateInSystemTimezone调用 问题原因: 之前的实现在计算系统时区日期时进行了双重偏移,导致时间范围错误 修复后: - 正确计算系统时区某一天的起止UTC时间 - "昨天"选项现在正确显示系统时区的完整一天(如29号0:00到29号23:59) - 适配所有时区的用户,不依赖用户浏览器时区 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- web/admin-spa/dist/index.html | 2 +- web/admin-spa/src/stores/dashboard.js | 66 ++++++++++++--------------- 2 files changed, 31 insertions(+), 37 deletions(-) diff --git a/web/admin-spa/dist/index.html b/web/admin-spa/dist/index.html index 0721fb8c..fe670ac7 100644 --- a/web/admin-spa/dist/index.html +++ b/web/admin-spa/dist/index.html @@ -18,7 +18,7 @@ - + diff --git a/web/admin-spa/src/stores/dashboard.js b/web/admin-spa/src/stores/dashboard.js index c7837448..787ac6f8 100644 --- a/web/admin-spa/src/stores/dashboard.js +++ b/web/admin-spa/src/stores/dashboard.js @@ -91,30 +91,30 @@ export const useDashboardStore = defineStore('dashboard', () => { } // 辅助函数:获取系统时区某一天的起止UTC时间 - // 输入:系统时区的日期(使用getDateInSystemTimezone转换后的) - // 输出:对应的UTC时间 - function getSystemTimezoneDay(systemTzDate, startOfDay = true) { + // 输入:一个日期(以用户本地时间表示) + // 输出:该日期在系统时区的0点/23:59对应的UTC时间 + function getSystemTimezoneDay(localDate, startOfDay = true) { const offset = dashboardData.value.systemTimezone || 8 - // 使用UTC方法获取系统时区日期的年月日 - const year = systemTzDate.getUTCFullYear() - const month = systemTzDate.getUTCMonth() - const day = systemTzDate.getUTCDate() - - // 创建一个新的Date对象 - const result = new Date() + // 获取用户本地日期的年月日 + const year = localDate.getFullYear() + const month = localDate.getMonth() + const day = localDate.getDate() + // 创建UTC时间,表示系统时区的该日期 if (startOfDay) { - // 设置为系统时区的0点(UTC时间) - result.setUTCFullYear(year, month, day) - result.setUTCHours(0 - offset, 0, 0, 0) + // 系统时区YYYY-MM-DD 00:00:00 对应的UTC时间 + const utcDate = new Date(Date.UTC(year, month, day, 0, 0, 0, 0)) + // 减去系统时区偏移得到UTC时间 + utcDate.setUTCHours(utcDate.getUTCHours() - offset) + return utcDate } else { - // 设置为系统时区的23:59:59.999(UTC时间) - result.setUTCFullYear(year, month, day) - result.setUTCHours(23 - offset, 59, 59, 999) + // 系统时区YYYY-MM-DD 23:59:59.999 对应的UTC时间 + const utcDate = new Date(Date.UTC(year, month, day, 23, 59, 59, 999)) + // 减去系统时区偏移得到UTC时间 + utcDate.setUTCHours(utcDate.getUTCHours() - offset) + return utcDate } - - return result } // 方法 @@ -199,17 +199,15 @@ export const useDashboardStore = defineStore('dashboard', () => { break case 'yesterday': // 昨天:基于系统时区的昨天 - const systemNow = getDateInSystemTimezone(now) - const yesterday = new Date(systemNow) - yesterday.setUTCDate(yesterday.getUTCDate() - 1) + const yesterday = new Date(now) + yesterday.setDate(yesterday.getDate() - 1) startTime = getSystemTimezoneDay(yesterday, true) endTime = getSystemTimezoneDay(yesterday, false) break case 'dayBefore': // 前天:基于系统时区的前天 - const systemNow2 = getDateInSystemTimezone(now) - const dayBefore = new Date(systemNow2) - dayBefore.setUTCDate(dayBefore.getUTCDate() - 2) + const dayBefore = new Date(now) + dayBefore.setDate(dayBefore.getDate() - 2) startTime = getSystemTimezoneDay(dayBefore, true) endTime = getSystemTimezoneDay(dayBefore, false) break @@ -279,17 +277,15 @@ export const useDashboardStore = defineStore('dashboard', () => { break case 'yesterday': // 昨天:基于系统时区的昨天 - const systemNow3 = getDateInSystemTimezone(now) - const yesterday = new Date(systemNow3) - yesterday.setUTCDate(yesterday.getUTCDate() - 1) + const yesterday = new Date(now) + yesterday.setDate(yesterday.getDate() - 1) startTime = getSystemTimezoneDay(yesterday, true) endTime = getSystemTimezoneDay(yesterday, false) break case 'dayBefore': // 前天:基于系统时区的前天 - const systemNow4 = getDateInSystemTimezone(now) - const dayBefore = new Date(systemNow4) - dayBefore.setUTCDate(dayBefore.getUTCDate() - 2) + const dayBefore = new Date(now) + dayBefore.setDate(dayBefore.getDate() - 2) startTime = getSystemTimezoneDay(dayBefore, true) endTime = getSystemTimezoneDay(dayBefore, false) break @@ -351,17 +347,15 @@ export const useDashboardStore = defineStore('dashboard', () => { break case 'yesterday': // 昨天:基于系统时区的昨天 - const systemNow5 = getDateInSystemTimezone(now) - const yesterday2 = new Date(systemNow5) - yesterday2.setUTCDate(yesterday2.getUTCDate() - 1) + const yesterday2 = new Date(now) + yesterday2.setDate(yesterday2.getDate() - 1) startDate = getSystemTimezoneDay(yesterday2, true) endDate = getSystemTimezoneDay(yesterday2, false) break case 'dayBefore': // 前天:基于系统时区的前天 - const systemNow6 = getDateInSystemTimezone(now) - const dayBefore2 = new Date(systemNow6) - dayBefore2.setUTCDate(dayBefore2.getUTCDate() - 2) + const dayBefore2 = new Date(now) + dayBefore2.setDate(dayBefore2.getDate() - 2) startDate = getSystemTimezoneDay(dayBefore2, true) endDate = getSystemTimezoneDay(dayBefore2, false) break