add and parse timezone in date filter

This commit is contained in:
yuki 2025-10-18 08:11:22 -03:00
parent fc81ffd7fe
commit 7cc92813c6
Signed by: yuki
GPG key ID: 0C98E6FF04EC3915

View file

@ -8,7 +8,37 @@ const toml = require("@iarna/toml");
const fs = require("fs");
const path = require("path");
const TIME_ZONE = "America/Santiago";
module.exports = function (eleventyConfig) {
eleventyConfig.addDateParsing(function (dateValue) {
// i know this is a deranged solution. sorry LOL
let localDate;
try {
if (dateValue instanceof Date && !isNaN(dateValue)) {
// handle filename dates (ie 2025-10-18-post.md)
localDate = DateTime.fromJSDate(dateValue, { zone: "utc" })
.setZone(TIME_ZONE)
.startOf("day"); // Set to midnight in America/Santiago
} else if (typeof dateValue === "string" && dateValue) {
// handle string dates (ie from front matter, if used)
localDate = DateTime.fromISO(dateValue, { zone: TIME_ZONE }).startOf("day");
} else {
// handle invalid input
console.warn(`Invalid date value: ${dateValue} for ${this.page.inputPath}`);
localDate = DateTime.now().setZone(TIME_ZONE).startOf("day");
}
if (!localDate || localDate.isValid === false) {
throw new Error(`Invalid date value (${dateValue}) for ${this.page.inputPath}: ${localDate?.invalidReason || "Unknown"}`);
}
return localDate.toJSDate();
} catch (error) {
console.error(`Date parsing error for ${this.page.inputPath}:`, error.message);
// fallback to current date in TIME_ZONE
return DateTime.now().setZone(TIME_ZONE).startOf("day").toJSDate();
}
});
eleventyConfig.setLayoutsDirectory("_layouts");
eleventyConfig.addPassthroughCopy("img");
@ -35,8 +65,26 @@ module.exports = function (eleventyConfig) {
return filtered;
});
eleventyConfig.addFilter("date", function (dateObj, format) {
return DateTime.fromJSDate(dateObj).toFormat(format);
eleventyConfig.addFilter("date", function (dateObj, format = "dd/MM/yyyy") {
let dt = dateObj;
// handle string dates
if (typeof dateObj === "string") {
dt = DateTime.fromISO(dateObj, { zone: TIME_ZONE }).toJSDate();
}
// handle DateTime objects (from addDateParsing)
if (dateObj instanceof DateTime) {
dt = dateObj.toJSDate();
}
// check dt as valid Date object
if (!(dt instanceof Date) || isNaN(dt)) {
console.log("Invalid date input:", dateObj);
return "";
}
// format in TIME_ZONE
const formatted = DateTime.fromJSDate(dt, { zone: TIME_ZONE })
.toFormat(format);
console.log("Date input:", dt, "Formatted:", formatted, "Timezone:", TIME_ZONE);
return formatted;
});
eleventyConfig.addPlugin(eleventySass);