fix(admin-spa): 修正时区计算双重偏移问题

- 重写getSystemTimezoneDay函数,修复之前的双重偏移错误
- 简化时间计算逻辑,直接使用Date.UTC创建系统时区时间
- 移除不必要的getDateInSystemTimezone调用

问题原因:
之前的实现在计算系统时区日期时进行了双重偏移,导致时间范围错误

修复后:
- 正确计算系统时区某一天的起止UTC时间
- "昨天"选项现在正确显示系统时区的完整一天(如29号0:00到29号23:59)
- 适配所有时区的用户,不依赖用户浏览器时区

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
shaw
2025-07-30 11:01:51 +08:00
parent a265ebf335
commit 6eae292922
2 changed files with 31 additions and 37 deletions

View File

@@ -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.999UTC时间
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