Files
SixFlagsSuperCalendar/lib/timezone.ts
T
josh 4f838d99c1
Build and Deploy / Build & Push (push) Successful in 3m7s
feat: add per-ride history charts with wait time and uptime tracking
Adds a cron-driven sampler that snapshots Queue-Times waits and Six Flags
Fast Lane data every 5 minutes into a new ride_wait_samples table, and a
clickable per-ride detail page at /park/[id]/ride/[slug] with Today / 7d /
30d Recharts views plus a 30d uptime pill. Rides are keyed by Queue-Times'
stable qt_ride_id so renames don't fragment history. Samples store
pre-bucketed local_date and local_time in the park's IANA timezone so
aggregations are pure SQL and DST-safe.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 23:35:27 -04:00

30 lines
821 B
TypeScript

/**
* Format a Date as YYYY-MM-DD in an IANA timezone.
*
* Uses "en-CA" because that locale natively produces ISO-style dates,
* so we don't have to reassemble parts.
*/
export function formatLocalDate(d: Date, tz: string): string {
return new Intl.DateTimeFormat("en-CA", {
timeZone: tz,
year: "numeric",
month: "2-digit",
day: "2-digit",
}).format(d);
}
/**
* Format a Date as HH:MM (24-hour) in an IANA timezone.
*/
export function formatLocalTime(d: Date, tz: string): string {
const parts = new Intl.DateTimeFormat("en-GB", {
timeZone: tz,
hour: "2-digit",
minute: "2-digit",
hour12: false,
}).formatToParts(d);
const h = parts.find((p) => p.type === "hour")?.value ?? "00";
const m = parts.find((p) => p.type === "minute")?.value ?? "00";
return `${h}:${m}`;
}