export const SERVER_TIME_ZONE = process.env.NEXT_PUBLIC_SERVER_TIME_ZONE ?? "Europe/Madrid"; export function getDateKeyInTimeZone(date = new Date(), timeZone = SERVER_TIME_ZONE): string { const formatter = new Intl.DateTimeFormat("en-CA", { timeZone, year: "numeric", month: "2-digit", day: "2-digit", }); const parts = formatter.formatToParts(date); const year = parts.find((part) => part.type === "year")?.value; const month = parts.find((part) => part.type === "month")?.value; const day = parts.find((part) => part.type === "day")?.value; if (!year || !month || !day) { return date.toISOString().slice(0, 10); } return `${year}-${month}-${day}`; } export function secondsUntilNextPuzzle(now = new Date(), timeZone = SERVER_TIME_ZONE): number { const formatter = new Intl.DateTimeFormat("en-GB", { timeZone, hour12: false, hour: "2-digit", minute: "2-digit", second: "2-digit", }); const parts = formatter.formatToParts(now); const hour = Number(parts.find((part) => part.type === "hour")?.value ?? 0) % 24; const minute = Number(parts.find((part) => part.type === "minute")?.value ?? 0); const second = Number(parts.find((part) => part.type === "second")?.value ?? 0); const elapsedToday = hour * 3600 + minute * 60 + second; return Math.max(1, 86400 - elapsedToday); } export function formatCountdown(totalSeconds: number): string { const hours = Math.floor(totalSeconds / 3600); const minutes = Math.floor((totalSeconds % 3600) / 60); const seconds = totalSeconds % 60; return `${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}:${seconds .toString() .padStart(2, "0")}`; } export function formatElapsed(seconds: number): string { const minutes = Math.floor(seconds / 60); const remainder = seconds % 60; return `${minutes}:${remainder.toString().padStart(2, "0")}`; }