From 48332efce4843f688e1afc14d868738ef96f9639 Mon Sep 17 00:00:00 2001 From: cheliangzhao Date: Sat, 10 Jan 2026 01:51:18 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=97=A5=E6=9C=9F?= =?UTF-8?q?=E8=8C=83=E5=9B=B4=E9=80=89=E6=8B=A9=E5=99=A8=E6=97=B6=E5=8C=BA?= =?UTF-8?q?=E5=92=8C=E6=80=A7=E8=83=BD=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复时区问题:使用本地时区格式化日期,避免 toISOString() 导致的日期偏移 - 优化日期范围选择器性能:使用 untrack 避免循环更新 - 统一日期格式化方法:在 utils.ts 中添加 formatLocalDate 工具函数 - 修复分页逻辑:优化页码计算和显示 - 更新相关页面:bills 和 analysis 页面使用统一的日期格式化方法 --- .../analysis/DailyTrendChart.svelte | 5 +- .../date-range-picker.svelte | 48 ++++++++++++++----- web/src/lib/utils.ts | 11 +++++ web/src/routes/analysis/+page.svelte | 6 ++- web/src/routes/bills/+page.svelte | 33 ++++++++----- 5 files changed, 75 insertions(+), 28 deletions(-) diff --git a/web/src/lib/components/analysis/DailyTrendChart.svelte b/web/src/lib/components/analysis/DailyTrendChart.svelte index ecf9edd..1e4580b 100644 --- a/web/src/lib/components/analysis/DailyTrendChart.svelte +++ b/web/src/lib/components/analysis/DailyTrendChart.svelte @@ -11,6 +11,7 @@ import { Button } from '$lib/components/ui/button'; import type { BillRecord } from '$lib/api'; import { pieColors } from '$lib/constants/chart'; + import { formatLocalDate } from '$lib/utils'; import BillRecordsTable from './BillRecordsTable.svelte'; interface Props { @@ -96,7 +97,7 @@ const day = d.getDay(); const diff = d.getDate() - day + (day === 0 ? -6 : 1); // 调整到周一 d.setDate(diff); - return d.toISOString().split('T')[0]; + return formatLocalDate(d); } // 获取月份标识 @@ -526,7 +527,7 @@ // 点击图表任意位置都触发,选择最近的日期 const clickedDate = data[closestIdx].date; - const dateStr = clickedDate.toISOString().split('T')[0]; + const dateStr = formatLocalDate(clickedDate); // 找出当天的所有支出记录 selectedDate = clickedDate; diff --git a/web/src/lib/components/ui/date-range-picker/date-range-picker.svelte b/web/src/lib/components/ui/date-range-picker/date-range-picker.svelte index c39b70b..ed727ac 100644 --- a/web/src/lib/components/ui/date-range-picker/date-range-picker.svelte +++ b/web/src/lib/components/ui/date-range-picker/date-range-picker.svelte @@ -1,4 +1,5 @@ @@ -73,8 +100,7 @@ = T extends { child?: any } ? Omit : T; // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/web/src/routes/analysis/+page.svelte b/web/src/routes/analysis/+page.svelte index fbf09df..3a0727b 100644 --- a/web/src/routes/analysis/+page.svelte +++ b/web/src/routes/analysis/+page.svelte @@ -5,6 +5,7 @@ import { Badge } from '$lib/components/ui/badge'; import * as Card from '$lib/components/ui/card'; import { DateRangePicker } from '$lib/components/ui/date-range-picker'; + import { formatLocalDate } from '$lib/utils'; import BarChart3 from '@lucide/svelte/icons/bar-chart-3'; import Loader2 from '@lucide/svelte/icons/loader-2'; import AlertCircle from '@lucide/svelte/icons/alert-circle'; @@ -41,8 +42,9 @@ const today = new Date(); const year = today.getFullYear(); const month = today.getMonth(); - const startDate = new Date(year, month, 1).toISOString().split('T')[0]; - const endDate = today.toISOString().split('T')[0]; + + const startDate = formatLocalDate(new Date(year, month, 1)); + const endDate = formatLocalDate(today); return { startDate, endDate }; } const defaultDates = getDefaultDates(); diff --git a/web/src/routes/bills/+page.svelte b/web/src/routes/bills/+page.svelte index 670d8ea..ccb04d7 100644 --- a/web/src/routes/bills/+page.svelte +++ b/web/src/routes/bills/+page.svelte @@ -8,6 +8,7 @@ import { Label } from '$lib/components/ui/label'; import * as Table from '$lib/components/ui/table'; import { DateRangePicker } from '$lib/components/ui/date-range-picker'; + import { formatLocalDate } from '$lib/utils'; import Loader2 from '@lucide/svelte/icons/loader-2'; import AlertCircle from '@lucide/svelte/icons/alert-circle'; import Search from '@lucide/svelte/icons/search'; @@ -40,8 +41,9 @@ const today = new Date(); const year = today.getFullYear(); const month = today.getMonth(); - const startDate = new Date(year, month, 1).toISOString().split('T')[0]; - const endDate = today.toISOString().split('T')[0]; + + const startDate = formatLocalDate(new Date(year, month, 1)); + const endDate = formatLocalDate(today); return { startDate, endDate }; } const defaultDates = getDefaultDates(); @@ -221,11 +223,9 @@
{ - startDate = start; - endDate = end; applyFilters(); }} /> @@ -344,6 +344,9 @@

显示 {(currentPage - 1) * pageSize + 1} - {Math.min(currentPage * pageSize, totalRecords)} 条,共 {totalRecords} 条 + {#if searchText} + (当前页筛选后:{displayRecords.length} 条) + {/if}