From 544d242968c710e2f03f5ff99e48f813bdaf7d1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emrik=20=C3=96stling?= Date: Sat, 3 Oct 2026 21:28:13 +0200 Subject: [PATCH 1/2] fix: wrong timezone in expenses --- src/lib/format.ts | 11 +++++++++++ src/routes/group.$id/expense.$expenseId.tsx | 3 ++- 2 files changed, 13 insertions(+), 1 deletion(-) 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..de44470 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 ?? "", From ffc458c15bb173cec97c06409ecf1b9e9d0764e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emrik=20=C3=96stling?= Date: Sat, 3 Oct 2026 21:44:37 +0200 Subject: [PATCH 2/2] don't update date if it didn't change --- src/routes/group.$id/expense.$expenseId.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/routes/group.$id/expense.$expenseId.tsx b/src/routes/group.$id/expense.$expenseId.tsx index de44470..4bc4416 100644 --- a/src/routes/group.$id/expense.$expenseId.tsx +++ b/src/routes/group.$id/expense.$expenseId.tsx @@ -68,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.