diff --git a/src/lib/components/DateTimePicker.svelte b/src/lib/components/DateTimePicker.svelte index c806ddb..79835fe 100644 --- a/src/lib/components/DateTimePicker.svelte +++ b/src/lib/components/DateTimePicker.svelte @@ -29,7 +29,9 @@ const seed = untrack(() => { if (initialValue) { - const d = new Date(initialValue) + // Append Z if no timezone indicator is present so it's always parsed as UTC + const normalized = /Z$|[+-]\d{2}:?\d{2}$/.test(initialValue) ? initialValue : initialValue + 'Z' + const d = new Date(normalized) return { month: d.getMonth(), day: d.getDate(), year: d.getFullYear(), timeIndex: d.getHours() * 4 + Math.round(d.getMinutes() / 15) } } const today = new Date() @@ -48,10 +50,9 @@ }) $effect(() => { - const pad = (n: number) => n.toString().padStart(2, '0') const hour = Math.floor(timeIndex / 4) const minute = (timeIndex % 4) * 15 - value = new Date(`${year}-${pad(month + 1)}-${pad(day)}T${pad(hour)}:${pad(minute)}`).toISOString() + value = new Date(year, month, day, hour, minute).toISOString() }) diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..7ed99ff --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,23 @@ +import type { HuntResponse } from './api/types' + +// Ensures API datetime strings are always parsed as UTC, even if the Z suffix is missing. +export function parseUTC(iso: string): Date { + const normalized = /Z$|[+-]\d{2}:?\d{2}$/.test(iso) ? iso : iso + 'Z' + return new Date(normalized) +} + +export function huntStatus(hunt: HuntResponse): 'ONGOING' | 'UNSTARTED' | 'CLOSED' { + if (hunt.isTerminated) return 'CLOSED' + const now = Date.now() + if (now < parseUTC(hunt.startDateTime).getTime()) return 'UNSTARTED' + if (now > parseUTC(hunt.endDateTime).getTime()) return 'CLOSED' + return 'ONGOING' +} + +export function formatDateTime(iso: string): string { + return parseUTC(iso).toLocaleDateString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }) +} + +export function formatDate(iso: string): string { + return parseUTC(iso).toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' }) +} diff --git a/src/routes/admin/AdminHome.svelte b/src/routes/admin/AdminHome.svelte index 7612248..2e84d45 100644 --- a/src/routes/admin/AdminHome.svelte +++ b/src/routes/admin/AdminHome.svelte @@ -1,6 +1,7 @@
{photo.hunterName} · {photo.teamName}
-{new Date(photo.photoUploadDateTime).toLocaleString()}
+{parseUTC(photo.photoUploadDateTime).toLocaleString()}
{photo.hunterName} · {photo.teamName}
- {new Date(photo.photoUploadDateTime).toLocaleString()} + {parseUTC(photo.photoUploadDateTime).toLocaleString()}
- {formatDate(hunt.startDateTime)} – {formatDate(hunt.endDateTime)} + {formatDateTime(hunt.startDateTime)} – {formatDateTime(hunt.endDateTime)}
- {formatDate(hunt.startDateTime)} – {formatDate(hunt.endDateTime)} + {formatDateTime(hunt.startDateTime)} – {formatDateTime(hunt.endDateTime)}
{#if myTeam}Team: {myTeam.name}
@@ -236,7 +224,7 @@{formatDate(sheetHunt.startDateTime)} – {formatDate(sheetHunt.endDateTime)}
+{formatDateTime(sheetHunt.startDateTime)} – {formatDateTime(sheetHunt.endDateTime)}
{photo.hunterName}
-{new Date(photo.photoUploadDateTime).toLocaleString()}
+{parseUTC(photo.photoUploadDateTime).toLocaleString()}