diff --git a/src/lib/format.ts b/src/lib/format.ts index 4f16c76..8268ba7 100644 --- a/src/lib/format.ts +++ b/src/lib/format.ts @@ -22,3 +22,14 @@ export function formatDay(isoDay: string) { if (isNaN(parsed)) return isoDay; return new Date(parsed).toLocaleDateString(undefined, { dateStyle: "medium", timeZone: "UTC" }); } + +/** + * Convert a UTC ISO date string into a local YYYY-MM-DDTHH:mm string + * suitable for a . + */ +export function toLocalDatetimeString(isoDate: string) { + const date = new Date(isoDate); + if (isNaN(date.getTime())) return ""; + const tzOffset = date.getTimezoneOffset() * 60000; + return new Date(date.getTime() - tzOffset).toISOString().slice(0, 16); +} diff --git a/src/routes/group.$id/expense.$expenseId.tsx b/src/routes/group.$id/expense.$expenseId.tsx index 2cec295..4bc4416 100644 --- a/src/routes/group.$id/expense.$expenseId.tsx +++ b/src/routes/group.$id/expense.$expenseId.tsx @@ -14,6 +14,7 @@ import { } from "@/hooks/useApi"; import { useAppForm } from "@/hooks/useAppForm"; import { expenseFormDefaults } from "@/lib/expense-form"; +import { toLocalDatetimeString } from "@/lib/format"; import { pb } from "@/lib/pocketbase"; import { requireAuth } from "@/lib/requireAuth"; import { createFileRoute, Link, useNavigate } from "@tanstack/react-router"; @@ -47,7 +48,7 @@ function EditExpensePage() { title: expense?.title ?? "", amount: expense?.amount?.toString() ?? "", currency: expense?.currency || base, - date: expense?.date ? expense.date.slice(0, 16) : "", + date: expense?.date ? toLocalDatetimeString(expense.date) : "", paidBy: expense?.paidBy ?? currentUserId, category: expense?.category ?? "", project: expense?.project ?? "", @@ -67,7 +68,10 @@ function EditExpensePage() { }, onSubmit: async ({ value }) => { const amount = parseFloat(value.amount); - const date = new Date(value.date).toISOString(); + const date = + expense?.date && value.date === toLocalDatetimeString(expense.date) + ? expense.date + : new Date(value.date).toISOString(); // Keep the originally locked rate unless the amount or currency changed; // otherwise re-convert at the rate effective on the expense's date.