40 lines
1.1 KiB
JavaScript
40 lines
1.1 KiB
JavaScript
// Datumshilfen fuer Buchungskalender: reine Funktionen auf Tagesstrings (YYYY-MM-DD), UTC-Arithmetik, keine I/O.
|
|
const TAG_RE = /^\d{4}-\d{2}-\d{2}$/
|
|
const TAG_MS = 86400000
|
|
|
|
function zuMs(tag) {
|
|
const [j, m, t] = tag.split('-').map(Number)
|
|
return Date.UTC(j, m - 1, t)
|
|
}
|
|
|
|
/** Gueltiger Kalendertag im Format YYYY-MM-DD. */
|
|
export function istTag(s) {
|
|
if (typeof s !== 'string' || !TAG_RE.test(s)) return false
|
|
const d = new Date(zuMs(s))
|
|
return d.toISOString().slice(0, 10) === s
|
|
}
|
|
|
|
/** Anzahl Naechte zwischen Anreise und Abreise. */
|
|
export function naechte(von, bis) {
|
|
return Math.round((zuMs(bis) - zuMs(von)) / TAG_MS)
|
|
}
|
|
|
|
/** Tag um n Tage verschoben. */
|
|
export function plusTage(tag, n) {
|
|
return new Date(zuMs(tag) + n * TAG_MS).toISOString().slice(0, 10)
|
|
}
|
|
|
|
/** Belegte Naechte: von inklusive, bis exklusive. */
|
|
export function tageVon(von, bis) {
|
|
const n = naechte(von, bis)
|
|
const out = []
|
|
for (let i = 0; i < n; i++) out.push(plusTage(von, i))
|
|
return out
|
|
}
|
|
|
|
/** '2026-11-12' wird '12.11.2026'. */
|
|
export function formatTag(tag) {
|
|
const [j, m, t] = tag.split('-')
|
|
return `${t}.${m}.${j}`
|
|
}
|