From 55f81ff329640adf788a743f55156bb8c7af45da Mon Sep 17 00:00:00 2001 From: hailin Date: Tue, 3 Mar 2026 03:11:48 -0800 Subject: [PATCH] =?UTF-8?q?fix(mobile-app):=20=E4=BF=AE=E5=A4=8D=E5=A4=9A?= =?UTF-8?q?=E4=B8=AA=E9=A1=B5=E9=9D=A2=E6=97=B6=E9=97=B4=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E4=B8=BAUTC=E8=80=8C=E9=9D=9E=E5=8C=97=E4=BA=AC=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 后端数据库统一存储UTC时间,前端展示时需调用 .toLocal() 转换为 设备本地时区(中国地区即 UTC+8 北京时间)。 以下5个页面的 _formatDateTime() 方法缺少 .toLocal() 转换, 导致页面显示的时间比北京时间慢8小时: - 预种合并详情页 (pre_planting_merge_detail_page.dart) → 合并时间、签署时间、挖矿开启时间 - 预种持仓页 (pre_planting_position_page.dart) → 购买时间、合并时间 - 合同签署页 (contract_signing_page.dart) → 合同签署时间 - 转让列表页 (transfer_list_page.dart) → 转让创建时间 - 转让详情页 (transfer_detail_page.dart) → 转让各状态时间 修复方式:在格式化前统一调用 dt.toLocal() 将UTC转为本地时区。 后端和数据库保持UTC不变,仅前端展示层做时区转换。 注:ledger_detail_page.dart 已使用 DateTimeUtils.formatDateTime() (内含 .toLocal()),无需修改。 Co-Authored-By: Claude Opus 4.6 --- .../presentation/pages/contract_signing_page.dart | 3 ++- .../pages/pre_planting_merge_detail_page.dart | 11 ++++++----- .../pages/pre_planting_position_page.dart | 11 ++++++----- .../presentation/pages/transfer_detail_page.dart | 5 +++-- .../presentation/pages/transfer_list_page.dart | 5 +++-- 5 files changed, 20 insertions(+), 15 deletions(-) diff --git a/frontend/mobile-app/lib/features/contract_signing/presentation/pages/contract_signing_page.dart b/frontend/mobile-app/lib/features/contract_signing/presentation/pages/contract_signing_page.dart index d21fd535..5bfde5a0 100644 --- a/frontend/mobile-app/lib/features/contract_signing/presentation/pages/contract_signing_page.dart +++ b/frontend/mobile-app/lib/features/contract_signing/presentation/pages/contract_signing_page.dart @@ -852,7 +852,8 @@ class _ContractSigningPageState extends ConsumerState { /// 格式化日期时间 String _formatDateTime(DateTime? dateTime) { if (dateTime == null) return '-'; - return '${dateTime.year}-${dateTime.month.toString().padLeft(2, '0')}-${dateTime.day.toString().padLeft(2, '0')} ${dateTime.hour.toString().padLeft(2, '0')}:${dateTime.minute.toString().padLeft(2, '0')}'; + final local = dateTime.toLocal(); + return '${local.year}-${local.month.toString().padLeft(2, '0')}-${local.day.toString().padLeft(2, '0')} ${local.hour.toString().padLeft(2, '0')}:${local.minute.toString().padLeft(2, '0')}'; } /// 构建合同信息卡片 diff --git a/frontend/mobile-app/lib/features/pre_planting/presentation/pages/pre_planting_merge_detail_page.dart b/frontend/mobile-app/lib/features/pre_planting/presentation/pages/pre_planting_merge_detail_page.dart index decc72e1..f3e67c99 100644 --- a/frontend/mobile-app/lib/features/pre_planting/presentation/pages/pre_planting_merge_detail_page.dart +++ b/frontend/mobile-app/lib/features/pre_planting/presentation/pages/pre_planting_merge_detail_page.dart @@ -711,12 +711,13 @@ class _PrePlantingMergeDetailPageState ); } - /// 格式化日期时间 + /// 格式化日期时间(UTC → 本地时区) String _formatDateTime(DateTime dt) { - return '${dt.year}-${dt.month.toString().padLeft(2, '0')}-' - '${dt.day.toString().padLeft(2, '0')} ' - '${dt.hour.toString().padLeft(2, '0')}:' - '${dt.minute.toString().padLeft(2, '0')}'; + final local = dt.toLocal(); + return '${local.year}-${local.month.toString().padLeft(2, '0')}-' + '${local.day.toString().padLeft(2, '0')} ' + '${local.hour.toString().padLeft(2, '0')}:' + '${local.minute.toString().padLeft(2, '0')}'; } } diff --git a/frontend/mobile-app/lib/features/pre_planting/presentation/pages/pre_planting_position_page.dart b/frontend/mobile-app/lib/features/pre_planting/presentation/pages/pre_planting_position_page.dart index db46f247..2094d143 100644 --- a/frontend/mobile-app/lib/features/pre_planting/presentation/pages/pre_planting_position_page.dart +++ b/frontend/mobile-app/lib/features/pre_planting/presentation/pages/pre_planting_position_page.dart @@ -815,11 +815,12 @@ class _PrePlantingPositionPageState ); } - /// 格式化日期时间 + /// 格式化日期时间(UTC → 本地时区) String _formatDateTime(DateTime dt) { - return '${dt.year}-${dt.month.toString().padLeft(2, '0')}-' - '${dt.day.toString().padLeft(2, '0')} ' - '${dt.hour.toString().padLeft(2, '0')}:' - '${dt.minute.toString().padLeft(2, '0')}'; + final local = dt.toLocal(); + return '${local.year}-${local.month.toString().padLeft(2, '0')}-' + '${local.day.toString().padLeft(2, '0')} ' + '${local.hour.toString().padLeft(2, '0')}:' + '${local.minute.toString().padLeft(2, '0')}'; } } diff --git a/frontend/mobile-app/lib/features/transfer/presentation/pages/transfer_detail_page.dart b/frontend/mobile-app/lib/features/transfer/presentation/pages/transfer_detail_page.dart index 5f2b70d5..808b6fb2 100644 --- a/frontend/mobile-app/lib/features/transfer/presentation/pages/transfer_detail_page.dart +++ b/frontend/mobile-app/lib/features/transfer/presentation/pages/transfer_detail_page.dart @@ -649,8 +649,9 @@ class _TransferDetailPageState extends ConsumerState { } String _formatDateTime(DateTime dt) { - return '${dt.year}-${dt.month.toString().padLeft(2, '0')}-${dt.day.toString().padLeft(2, '0')} ' - '${dt.hour.toString().padLeft(2, '0')}:${dt.minute.toString().padLeft(2, '0')}'; + final local = dt.toLocal(); + return '${local.year}-${local.month.toString().padLeft(2, '0')}-${local.day.toString().padLeft(2, '0')} ' + '${local.hour.toString().padLeft(2, '0')}:${local.minute.toString().padLeft(2, '0')}'; } } diff --git a/frontend/mobile-app/lib/features/transfer/presentation/pages/transfer_list_page.dart b/frontend/mobile-app/lib/features/transfer/presentation/pages/transfer_list_page.dart index 9bd5e467..fe30c525 100644 --- a/frontend/mobile-app/lib/features/transfer/presentation/pages/transfer_list_page.dart +++ b/frontend/mobile-app/lib/features/transfer/presentation/pages/transfer_list_page.dart @@ -397,8 +397,9 @@ class _TransferListPageState extends ConsumerState } String _formatDateTime(DateTime dt) { - return '${dt.year}-${dt.month.toString().padLeft(2, '0')}-${dt.day.toString().padLeft(2, '0')} ' - '${dt.hour.toString().padLeft(2, '0')}:${dt.minute.toString().padLeft(2, '0')}'; + final local = dt.toLocal(); + return '${local.year}-${local.month.toString().padLeft(2, '0')}-${local.day.toString().padLeft(2, '0')} ' + '${local.hour.toString().padLeft(2, '0')}:${local.minute.toString().padLeft(2, '0')}'; } }