fix(admin-spa): 修复时区转换计算错误

- 修复 getSystemTimezoneDay 函数:正确使用 Date.UTC 创建UTC时间,避免本地时区干扰
- 修复自定义时间范围转换:使用 Date.UTC 正确转换系统时区时间到UTC
- 解决了昨天/前天日期计算错误的问题
- 解决了自定义时间选择器8小时偏差的问题
This commit is contained in:
shaw
2025-07-30 12:13:53 +08:00
parent 4eedc2e6b5
commit 3188f4d058

View File

@@ -91,27 +91,26 @@ export const useDashboardStore = defineStore('dashboard', () => {
}
// 辅助函数获取系统时区某一天的起止UTC时间
// 输入:一个系统时区的日期对象
// 输入:一个本地时间的日期对象(如用户选择的日期)
// 输出该日期在系统时区的0点/23:59对应的UTC时间
function getSystemTimezoneDay(systemTzDate, startOfDay = true) {
const offset = dashboardData.value.systemTimezone || 8
function getSystemTimezoneDay(localDate, startOfDay = true) {
const systemTz = dashboardData.value.systemTimezone || 8
// 获取系统时区日期的年月日
const year = systemTzDate.getFullYear()
const month = systemTzDate.getMonth()
const day = systemTzDate.getDate()
// 获取本地日期的年月日(这是用户想要查看的日期)
const year = localDate.getFullYear()
const month = localDate.getMonth()
const day = localDate.getDate()
// 创建系统时区的日期时间
if (startOfDay) {
// 系统时区 YYYY-MM-DD 00:00:00
const systemDateTime = new Date(year, month, day, 0, 0, 0, 0)
// 转换为UTC时间减去时区偏移
return new Date(systemDateTime.getTime() - offset * 3600000)
// 创建UTC时间使其在系统时区(UTC+8)显示为 YYYY-MM-DD 00:00:00
// 例如要在UTC+8显示为 2025-07-28 00:00:00UTC时间应该是 2025-07-27 16:00:00
const utcDate = new Date(Date.UTC(year, month, day, 0 - systemTz, 0, 0, 0))
return utcDate
} else {
// 系统时区 YYYY-MM-DD 23:59:59.999
const systemDateTime = new Date(year, month, day, 23, 59, 59, 999)
// 转换为UTC时间减去时区偏移
return new Date(systemDateTime.getTime() - offset * 3600000)
// 创建UTC时间使其在系统时区(UTC+8)显示为 YYYY-MM-DD 23:59:59.999
// 例如要在UTC+8显示为 2025-07-28 23:59:59UTC时间应该是 2025-07-28 15:59:59
const utcDate = new Date(Date.UTC(year, month, day, 24 - systemTz - 1, 59, 59, 999))
return utcDate
}
}
@@ -188,12 +187,11 @@ export const useDashboardStore = defineStore('dashboard', () => {
const [year, month, day] = datePart.split('-').map(Number)
const [hours, minutes, seconds] = timePart.split(':').map(Number)
// 创建系统时区的Date对象
const systemDate = new Date(year, month - 1, day, hours, minutes, seconds)
// 转换为UTC
const utcTime = systemDate.getTime() - (systemTz * 3600000)
return new Date(utcTime).toISOString()
// 创建UTC时间使其在系统时区显示为用户选择的时间
// 例如:用户选择 UTC+8 的 2025-07-25 00:00:00
// 对应的UTC时间是 2025-07-24 16:00:00
const utcDate = new Date(Date.UTC(year, month - 1, day, hours - systemTz, minutes, seconds))
return utcDate.toISOString()
}
url += `&startDate=${encodeURIComponent(convertToUTC(dateFilter.value.customRange[0]))}`
@@ -281,12 +279,11 @@ export const useDashboardStore = defineStore('dashboard', () => {
const [year, month, day] = datePart.split('-').map(Number)
const [hours, minutes, seconds] = timePart.split(':').map(Number)
// 创建系统时区的Date对象
const systemDate = new Date(year, month - 1, day, hours, minutes, seconds)
// 转换为UTC
const utcTime = systemDate.getTime() - (systemTz * 3600000)
return new Date(utcTime).toISOString()
// 创建UTC时间使其在系统时区显示为用户选择的时间
// 例如:用户选择 UTC+8 的 2025-07-25 00:00:00
// 对应的UTC时间是 2025-07-24 16:00:00
const utcDate = new Date(Date.UTC(year, month - 1, day, hours - systemTz, minutes, seconds))
return utcDate.toISOString()
}
url += `&startDate=${encodeURIComponent(convertToUTC(dateFilter.value.customRange[0]))}`