Fix midnight hour format to ensure "00" instead of "24"
This commit is contained in:
@@ -285,6 +285,19 @@ describe("hafasDateTime", () => {
|
|||||||
expect(time).toBe("000000000");
|
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)", () => {
|
it("handles midnight wraparound (Vienna midnight is still previous UTC day)", () => {
|
||||||
// Vienna Jan 1 00:00 CET = Dec 31 23:00 UTC
|
// Vienna Jan 1 00:00 CET = Dec 31 23:00 UTC
|
||||||
const utc = new Date(Date.UTC(2023, 11, 31, 23, 0, 0));
|
const utc = new Date(Date.UTC(2023, 11, 31, 23, 0, 0));
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ function getTimezoneOffsetMinutes(instant: Date, tz: string): number {
|
|||||||
const getHour = (timeZone: string) => {
|
const getHour = (timeZone: string) => {
|
||||||
const parts = new Intl.DateTimeFormat("en-US", {
|
const parts = new Intl.DateTimeFormat("en-US", {
|
||||||
timeZone,
|
timeZone,
|
||||||
hour: "numeric",
|
hour: "2-digit",
|
||||||
hour12: false,
|
hour12: false,
|
||||||
}).formatToParts(instant);
|
}).formatToParts(instant);
|
||||||
return parseInt(parts.find((p) => p.type === "hour")!.value, 10);
|
return parseInt(parts.find((p) => p.type === "hour")!.value, 10);
|
||||||
@@ -79,7 +79,7 @@ function getDateTimeParts(instant: Date, tz: string) {
|
|||||||
year: "numeric",
|
year: "numeric",
|
||||||
month: "numeric",
|
month: "numeric",
|
||||||
day: "numeric",
|
day: "numeric",
|
||||||
hour: "numeric",
|
hour: "2-digit",
|
||||||
minute: "numeric",
|
minute: "numeric",
|
||||||
second: "numeric",
|
second: "numeric",
|
||||||
hour12: false,
|
hour12: false,
|
||||||
|
|||||||
Reference in New Issue
Block a user