From 348b02600d4b224f6b76a43fc2ef6e3cdc87967e Mon Sep 17 00:00:00 2001 From: Misaka_Company Date: Wed, 1 Apr 2026 13:54:26 +0800 Subject: [PATCH] fix(time): use UTC methods for operation history display The database stores time in UTC format, and the UI should display UTC time without timezone conversion. Use getUTCXxx() methods instead of getHours() to avoid adding 8-hour timezone offset. Also extract common datetime formatting logic to reduce code duplication. Co-Authored-By: Claude Opus 4.6 --- .../extractor-operation-history-dao.ts | 19 +++++++++++------ .../ExtractorOperationHistoryModal.tsx | 21 ++++++++++++------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/main/services/database/extractor-operation-history-dao.ts b/src/main/services/database/extractor-operation-history-dao.ts index eb992d4..5e24db2 100644 --- a/src/main/services/database/extractor-operation-history-dao.ts +++ b/src/main/services/database/extractor-operation-history-dao.ts @@ -21,6 +21,17 @@ import type { const log = createLogger('ExtractorOperationHistoryDAO') +/** + * Format datetime value from database to ISO string + * mssql driver returns Date objects in UTC format + */ +function formatDateTime(value: unknown): string { + if (value instanceof Date) { + return value.toISOString() + } + return value ? String(value) : new Date().toISOString() +} + /** * Configuration for ExtractorOperationHistory table */ @@ -324,9 +335,7 @@ export class ExtractorOperationHistoryDAO { batchId: row.BatchId as string, userId: row.UserId as number, username: row.Username as string, - operationTime: row.OperationTime - ? new Date(row.OperationTime as string).toISOString() - : new Date().toISOString(), + operationTime: formatDateTime(row.OperationTime), status: row.Status as string, totalOrders: row.TotalOrders as number, totalRecords: (row.TotalRecords as number) || 0, @@ -432,9 +441,7 @@ export class ExtractorOperationHistoryDAO { batchId: row.BatchId as string, userId: row.UserId as number, username: row.Username as string, - operationTime: row.OperationTime - ? new Date(row.OperationTime as string).toISOString() - : new Date().toISOString(), + operationTime: formatDateTime(row.OperationTime), status: row.Status as string, totalOrders: row.TotalOrders as number, totalRecords: (row.TotalRecords as number) || 0, diff --git a/src/renderer/src/components/ExtractorOperationHistoryModal.tsx b/src/renderer/src/components/ExtractorOperationHistoryModal.tsx index 2cec417..f148ffb 100644 --- a/src/renderer/src/components/ExtractorOperationHistoryModal.tsx +++ b/src/renderer/src/components/ExtractorOperationHistoryModal.tsx @@ -53,13 +53,20 @@ const statusIcons: Record = { const formatDateTime = (dateStr: string) => { const date = new Date(dateStr) - return date.toLocaleString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit' - }) + + // Check if the date is valid + if (isNaN(date.getTime())) { + return dateStr // Return original if invalid + } + + // Use UTC methods to display the time as stored in database (without timezone conversion) + 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') + + return `${year}-${month}-${day} ${hours}:${minutes}` } export const ExtractorOperationHistoryModal: React.FC = ({