UNPKG

dato-konverter

Version:

Konverter JavaScript-datoer til dansk format med korrekt tidszone. Understøtter formater som '15. okt. 2024 kl. 13:00' og tilbyder funktioner som dansk ugedag, ugenummer og weekend-detektion.

206 lines (205 loc) 7.74 kB
/** * Hjælpefunktion til at parse en dato fra forskellige formater (Date, string, number). * @param input En dato som Date, string eller timestamp. * @throws Fejl hvis datoen er ugyldig. * @returns En gyldig Date-objekt. */ function parseDate(input) { const date = input instanceof Date ? input : new Date(input); if (isNaN(date.getTime())) throw new Error(`Invalid date input: ${input}`); return date; } /** * Returnerer en dansk formateret dato med fleksible valg. * @param input En dato som Date, string eller timestamp. * @param opts Indstillinger for visning. * - weekday: true/false — skal ugedag vises? * - weekdayFormat: "short"/"long" * - monthFormat: "short"/"long" * - year: true/false — skal år vises? (default: true) * - time: true/false — skal klokkeslæt vises? * - includeKl: true/false — skal "kl." inkluderes i tidsformatet? (default: true) * - leadingZero: true/false — skal dag have foranstillet nul? (default: true) * @throws Fejl hvis datoen er ugyldig. * @example * formatDanishDate('2024-06-15T12:00:00Z', { weekday: true, year: false, time: true, includeKl: false }); * // => "lør. 15. jun. 14.00" */ export function formatDanishDate(input, opts) { const date = parseDate(input); const options = { weekday: opts?.weekday ? opts.weekdayFormat || "short" : undefined, day: opts?.leadingZero === false ? "numeric" : "2-digit", month: opts?.monthFormat || "short", year: opts?.year !== false ? "numeric" : undefined, timeZone: "Europe/Copenhagen", }; const datePart = date.toLocaleDateString("da-DK", options); const timePart = opts?.time ? date.toLocaleTimeString("da-DK", { hour: "2-digit", minute: "2-digit", hour12: false, timeZone: "Europe/Copenhagen", }) : ""; const spacer = timePart ? opts?.includeKl === false ? ` ${timePart}` : ` kl. ${timePart}` : ""; return `${datePart}${spacer}`; } /** * Returnerer en dansk formateret ugedag, fx: "lør.". * @param input En dato som Date, string eller timestamp. * @param opts Valgfrit - brug `{ long: true }` for fulde ugedagsnavne. F.eks: "lørdag". * @throws Fejl hvis datoen er ugyldig. * @returns En formateret ugedag i dansk format. * @example * danishWeekday('2024-06-15T12:00:00Z'); // "lør." * danishWeekday('2024-06-15T12:00:00Z', { long: true }); // "lørdag" */ export function danishWeekday(input, opts) { const date = parseDate(input); return date.toLocaleDateString("da-DK", { weekday: opts?.long ? "long" : "short", timeZone: "Europe/Copenhagen", }); } /** * Returnerer den danske ugenummer for en given dato. F.eks: 24 for 15. juni 2024. * @param input En dato som Date, string eller timestamp. * @throws Fejl hvis datoen er ugyldig. * @returns Et dansk ugenummer (1–53). * @example * danishWeekNumber('2024-06-15T12:00:00Z'); // 24 */ export function danishWeekNumber(input) { const date = parseDate(input); const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())); const day = d.getUTCDay() || 7; d.setUTCDate(d.getUTCDate() + 4 - day); const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)); return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7); } /** * Tjekker om en given dato er i weekenden (lørdag eller søndag) i Danmark. * @param input En dato som Date, string eller timestamp. * @throws Fejl hvis datoen er ugyldig. * @returns En boolean der angiver om datoen er i weekenden. * @example * danishIsWeekend('2024-06-15T12:00:00Z'); // true (lørdag) * danishIsWeekend('2024-06-16T12:00:00Z'); // true (søndag) * danishIsWeekend('2024-06-17T12:00:00Z'); // false (mandag) */ export function danishIsWeekend(input) { const date = parseDate(input); const day = date.getDay(); // 0 = søndag, 6 = lørdag return day === 0 || day === 6; } /** * Tjekker om en given dato er i dag. * @param input En dato som Date, string eller timestamp. * @throws Fejl hvis datoen er ugyldig. * @returns En boolean der angiver om datoen er i dag. * @example * danishIsToday('2024-06-15T12:00:00Z'); // false (hvis i dag er 16. juni 2024) * danishIsToday(new Date()); // true (hvis i dag er 16. juni 2024) */ export function danishIsToday(input) { const date = parseDate(input); const today = new Date(); const inputStr = date.toLocaleDateString("da-DK", { timeZone: "Europe/Copenhagen", }); const todayStr = today.toLocaleDateString("da-DK", { timeZone: "Europe/Copenhagen", }); return inputStr === todayStr; } /** * Tjekker om en given dato er i morgen. * @param input En dato som Date, string eller timestamp. * @throws Fejl hvis datoen er ugyldig. * @returns En boolean der angiver om datoen er i morgen. * @example * danishIsTomorrow('2024-06-16T12:00:00Z'); // true (hvis i dag er 15. juni 2024) * danishIsTomorrow(new Date()); // false (hvis i dag er 16. juni 2024) */ export function danishIsTomorrow(input) { const date = parseDate(input); const tomorrow = new Date(); tomorrow.setDate(tomorrow.getDate() + 1); const inputStr = date.toLocaleDateString("da-DK", { timeZone: "Europe/Copenhagen", }); const tomorrowStr = tomorrow.toLocaleDateString("da-DK", { timeZone: "Europe/Copenhagen", }); return inputStr === tomorrowStr; } /** * Formaterer en dato til en relativ dansk dato-streng. * @param input En dato som Date, string eller timestamp. * @throws Fejl hvis datoen er ugyldig. * @returns En formateret relativ dato-streng i dansk format. * @example * formatRelativeDanishDate('2024-06-12T07:58:00Z'); // "09.58" * formatRelativeDanishDate('2024-06-11T07:58:00Z'); // "i går 09.58" * formatRelativeDanishDate('2024-06-10T07:00:00Z'); // "mandag 10.06" * formatRelativeDanishDate('2024-05-27T08:41:00Z'); // "27.05 10.41" */ export function formatRelativeDanishDate(input) { const date = parseDate(input); const now = new Date(); const cphOpts = { timeZone: "Europe/Copenhagen" }; const todayStr = now.toLocaleDateString("da-DK", cphOpts); const inputStr = date.toLocaleDateString("da-DK", cphOpts); const time = date .toLocaleTimeString("da-DK", { hour: "2-digit", minute: "2-digit", hour12: false, ...cphOpts, }) .replace(":", "."); // I dag if (inputStr === todayStr) return time; // I går const yesterday = new Date(now); yesterday.setDate(now.getDate() - 1); const yesterdayStr = yesterday.toLocaleDateString("da-DK", cphOpts); if (inputStr === yesterdayStr) return `i går ${time}`; // Dato-forskel i dage const startOfNow = new Date(now); startOfNow.setHours(0, 0, 0, 0); const startOfDate = new Date(date); startOfDate.setHours(0, 0, 0, 0); const diffInMs = startOfNow.getTime() - startOfDate.getTime(); const diffInDays = Math.floor(diffInMs / (1000 * 60 * 60 * 24)); if (diffInDays > 0 && diffInDays <= 6) { const weekday = danishWeekday(date); const dayMonth = date.toLocaleDateString("da-DK", { day: "2-digit", month: "2-digit", timeZone: "Europe/Copenhagen", }); return `${weekday} ${dayMonth}`; } // Ældre end 7 dage – vis dag.måned klokkeslæt return date .toLocaleString("da-DK", { day: "2-digit", month: "2-digit", hour: "2-digit", minute: "2-digit", hour12: false, ...cphOpts, }) .replace(",", "") .replace(":", "."); }