Normalisation des dates/heures
This commit is contained in:
@@ -32,6 +32,57 @@ function getHugoTimeZone() {
|
||||
return cachedTimeZone;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse une chaîne de date selon les formats Hugo attendus.
|
||||
* @param {string} value Chaîne de date.
|
||||
* @param {string} zone Fuseau horaire IANA.
|
||||
* @param {number} defaultHour Heure par défaut si absente.
|
||||
* @param {number} defaultMinute Minute par défaut si absente.
|
||||
* @returns {import("luxon").DateTime|null} DateTime ou null si invalide.
|
||||
*/
|
||||
function parseHugoDateString(value, zone, defaultHour = 12, defaultMinute = 0) {
|
||||
let trimmed = value.trim();
|
||||
if (!trimmed) {
|
||||
return null;
|
||||
}
|
||||
if (
|
||||
(trimmed.startsWith("'") && trimmed.endsWith("'")) ||
|
||||
(trimmed.startsWith("\"") && trimmed.endsWith("\""))
|
||||
) {
|
||||
trimmed = trimmed.slice(1, -1).trim();
|
||||
}
|
||||
|
||||
const iso = DateTime.fromISO(trimmed, { setZone: true });
|
||||
if (iso.isValid) {
|
||||
return iso.setZone(zone);
|
||||
}
|
||||
|
||||
const formats = [
|
||||
"yyyy-LL-dd HH:mm:ss",
|
||||
"yyyy-LL-dd'T'HH:mm:ss",
|
||||
"yyyy-LL-dd HH:mm",
|
||||
"yyyy-LL-dd'T'HH:mm",
|
||||
"yyyy-LL-dd",
|
||||
];
|
||||
|
||||
for (const format of formats) {
|
||||
const parsed = DateTime.fromFormat(trimmed, format, { zone });
|
||||
if (parsed.isValid) {
|
||||
if (format === "yyyy-LL-dd") {
|
||||
return parsed.set({ hour: defaultHour, minute: defaultMinute, second: 0, millisecond: 0 });
|
||||
}
|
||||
return parsed;
|
||||
}
|
||||
}
|
||||
|
||||
const rfc2822 = DateTime.fromRFC2822(trimmed, { setZone: true });
|
||||
if (rfc2822.isValid) {
|
||||
return rfc2822.setZone(zone);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convertit une valeur vers un DateTime positionné sur le fuseau horaire Hugo.
|
||||
* @param {Date|import("luxon").DateTime|string|number|null} value Valeur à convertir (null : maintenant).
|
||||
@@ -65,9 +116,9 @@ function toHugoDateTime(value = null) {
|
||||
}
|
||||
|
||||
if (typeof value === "string") {
|
||||
const parsed = DateTime.fromISO(value, { setZone: true }).setZone(zone);
|
||||
if (!parsed.isValid) {
|
||||
throw new Error(parsed.invalidReason || `Chaîne de date invalide : ${value}`);
|
||||
const parsed = parseHugoDateString(value, zone);
|
||||
if (!parsed) {
|
||||
throw new Error(`Chaîne de date invalide : ${value}`);
|
||||
}
|
||||
return parsed;
|
||||
}
|
||||
@@ -84,14 +135,14 @@ function toHugoDateTime(value = null) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Formate une date en ISO 8601 avec l'offset du fuseau horaire Hugo.
|
||||
* Formate une date selon le format Hugo simple (sans offset).
|
||||
* @param {Date|import("luxon").DateTime|string|number|null} value Valeur à formater.
|
||||
* @returns {string} Timestamp ISO 8601 avec offset.
|
||||
* @returns {string} Date formatée.
|
||||
*/
|
||||
function formatDateTime(value = null) {
|
||||
const zoned = toHugoDateTime(value);
|
||||
const normalized = zoned.set({ millisecond: 0 });
|
||||
const formatted = normalized.toISO({ suppressMilliseconds: true });
|
||||
const formatted = normalized.toFormat("yyyy-LL-dd HH:mm:ss");
|
||||
|
||||
if (!formatted) {
|
||||
throw new Error("Impossible de formater la date avec le fuseau Hugo.");
|
||||
@@ -119,16 +170,8 @@ function parseFrontmatterDate(value) {
|
||||
}
|
||||
|
||||
if (typeof value === "string") {
|
||||
const trimmed = value.trim();
|
||||
if (!trimmed) {
|
||||
return null;
|
||||
}
|
||||
const iso = DateTime.fromISO(trimmed, { setZone: true }).setZone(zone);
|
||||
if (iso.isValid) {
|
||||
return iso;
|
||||
}
|
||||
const rfc2822 = DateTime.fromRFC2822(trimmed, { setZone: true }).setZone(zone);
|
||||
return rfc2822.isValid ? rfc2822 : null;
|
||||
const parsed = parseHugoDateString(value, zone);
|
||||
return parsed;
|
||||
}
|
||||
|
||||
if (typeof value === "number" && Number.isFinite(value)) {
|
||||
|
||||
Reference in New Issue
Block a user