From 420f811488a5b0ca76d0dfe2e99845e32cc7891a Mon Sep 17 00:00:00 2001 From: Misaka_Company Date: Mon, 13 Apr 2026 17:52:50 +0800 Subject: [PATCH] fix(timezone): use UTC for database storage and local time for UI display MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backend changes: - SQL Server dialect: GETDATE() → SYSUTCDATETIME() - MySQL dialect: NOW() → UTC_TIMESTAMP() - Ensures OperationTime and EndTime use consistent UTC timezone Frontend changes: - formatDateTime: display UTC timestamps in user's local timezone - Uses getFullYear/getMonth/getDate/getHours (local) instead of UTC methods Data migration: - Executed migration script to fix historical OperationTime records - All existing records now have correct UTC timestamps - Execution duration now accurate (minutes, not hours) Impact: - New executions store UTC timestamps correctly - UI displays times in user's local timezone (UTC+8 for CN users) - Historical data corrected via migration - Time difference between OperationTime and EndTime now accurate --- .../services/database/dialects/mysql-dialect.ts | 2 +- .../services/database/dialects/sqlserver-dialect.ts | 2 +- .../src/components/CleanerOperationHistoryModal.tsx | 13 +++++++------ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/services/database/dialects/mysql-dialect.ts b/src/main/services/database/dialects/mysql-dialect.ts index 28f88a6..53b19a1 100644 --- a/src/main/services/database/dialects/mysql-dialect.ts +++ b/src/main/services/database/dialects/mysql-dialect.ts @@ -27,7 +27,7 @@ export class MySqlDialect implements SqlDialect { } currentTimestamp(): string { - return 'NOW()' + return 'UTC_TIMESTAMP()' } upsert(params: { diff --git a/src/main/services/database/dialects/sqlserver-dialect.ts b/src/main/services/database/dialects/sqlserver-dialect.ts index 7dd4d42..51c41e8 100644 --- a/src/main/services/database/dialects/sqlserver-dialect.ts +++ b/src/main/services/database/dialects/sqlserver-dialect.ts @@ -26,7 +26,7 @@ export class SqlServerDialect implements SqlDialect { } currentTimestamp(): string { - return 'GETDATE()' + return 'SYSUTCDATETIME()' } upsert(params: { diff --git a/src/renderer/src/components/CleanerOperationHistoryModal.tsx b/src/renderer/src/components/CleanerOperationHistoryModal.tsx index 3e5ec77..4a178ca 100644 --- a/src/renderer/src/components/CleanerOperationHistoryModal.tsx +++ b/src/renderer/src/components/CleanerOperationHistoryModal.tsx @@ -88,12 +88,13 @@ const formatDateTime = (dateStr: string | Date | null | undefined): string => { return String(dateStr) } - const year = date.getUTCFullYear() - const month = String(date.getUTCMonth() + 1).padStart(2, '0') - const day = String(date.getUTCDate()).padStart(2, '0') - const hours = String(date.getUTCHours()).padStart(2, '0') - const minutes = String(date.getUTCMinutes()).padStart(2, '0') - const seconds = String(date.getUTCSeconds()).padStart(2, '0') + // Use local time instead of UTC for display + const year = date.getFullYear() + const month = String(date.getMonth() + 1).padStart(2, '0') + const day = String(date.getDate()).padStart(2, '0') + const hours = String(date.getHours()).padStart(2, '0') + const minutes = String(date.getMinutes()).padStart(2, '0') + const seconds = String(date.getSeconds()).padStart(2, '0') return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}` }