47 lines
1.2 KiB
JavaScript
47 lines
1.2 KiB
JavaScript
const { DateTime } = require("luxon");
|
|
|
|
function hasExplicitTime(rawDate) {
|
|
if (!rawDate) return false;
|
|
const cleaned = rawDate.replace(/^['"]|['"]$/g, "");
|
|
return /\d{2}:\d{2}/.test(cleaned);
|
|
}
|
|
|
|
function resolveArticleDate(dateValue, rawDate, { timezone = "Europe/Paris", defaultHour = 12, defaultMinute = 0 } = {}) {
|
|
const hasTime = hasExplicitTime(rawDate);
|
|
const zone = timezone || "UTC";
|
|
|
|
let parsed;
|
|
|
|
if (typeof dateValue === "string") {
|
|
parsed = DateTime.fromISO(dateValue, { zone });
|
|
|
|
if (!parsed.isValid) {
|
|
parsed = DateTime.fromRFC2822(dateValue, { zone });
|
|
}
|
|
} else if (dateValue instanceof Date) {
|
|
parsed = DateTime.fromJSDate(dateValue, { zone });
|
|
}
|
|
|
|
if (!parsed || !parsed.isValid) return null;
|
|
|
|
if (!hasTime) {
|
|
parsed = parsed.set({ hour: defaultHour, minute: defaultMinute, second: 0, millisecond: 0 });
|
|
}
|
|
|
|
return parsed;
|
|
}
|
|
|
|
function buildTimeWindow(target, windowMinutes = 60) {
|
|
const minutes = Number.isFinite(windowMinutes) ? windowMinutes : 60;
|
|
return {
|
|
start: target.minus({ minutes }),
|
|
end: target.plus({ minutes }),
|
|
};
|
|
}
|
|
|
|
module.exports = {
|
|
buildTimeWindow,
|
|
hasExplicitTime,
|
|
resolveArticleDate,
|
|
};
|