diff --git a/src/lib/__tests__/hafas-time.test.ts b/src/lib/__tests__/hafas-time.test.ts index db236d1..a6c73cd 100644 --- a/src/lib/__tests__/hafas-time.test.ts +++ b/src/lib/__tests__/hafas-time.test.ts @@ -285,6 +285,19 @@ describe("hafasDateTime", () => { expect(time).toBe("000000000"); }); + it('produces "00" for midnight, not "24" (k-clock safety)', () => { + // Older ICU / Node can render midnight as "24" with hour: "numeric" + hour12: false. + // We use hour: "2-digit" which guarantees "00" through "23". + const utc = new Date(Date.UTC(2024, 0, 15, 0, 0, 0)); // Jan 15 00:00 UTC = Jan 15 01:00 CET + const { date: _date, time } = hafasDateTime(utc); + expect(time.startsWith("0")).toBe(true); // first digit is "0" from "01", never "24" + + // Direct midnight in Vienna: Dec 31 23:00 UTC = Jan 1 00:00 CET + const midnightUtc = new Date(Date.UTC(2023, 11, 31, 23, 0, 0)); + const { time: midnightTime } = hafasDateTime(midnightUtc); + expect(midnightTime).toBe("000000000"); + }); + it("handles midnight wraparound (Vienna midnight is still previous UTC day)", () => { // Vienna Jan 1 00:00 CET = Dec 31 23:00 UTC const utc = new Date(Date.UTC(2023, 11, 31, 23, 0, 0)); diff --git a/src/lib/hafas-time.ts b/src/lib/hafas-time.ts index 78418a4..a4d341d 100644 --- a/src/lib/hafas-time.ts +++ b/src/lib/hafas-time.ts @@ -14,7 +14,7 @@ function getTimezoneOffsetMinutes(instant: Date, tz: string): number { const getHour = (timeZone: string) => { const parts = new Intl.DateTimeFormat("en-US", { timeZone, - hour: "numeric", + hour: "2-digit", hour12: false, }).formatToParts(instant); return parseInt(parts.find((p) => p.type === "hour")!.value, 10); @@ -79,7 +79,7 @@ function getDateTimeParts(instant: Date, tz: string) { year: "numeric", month: "numeric", day: "numeric", - hour: "numeric", + hour: "2-digit", minute: "numeric", second: "numeric", hour12: false,