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