49 lines
2.9 KiB
JavaScript
49 lines
2.9 KiB
JavaScript
import test from "node:test";
|
|||
|
|
import assert from "node:assert/strict";
|
||
|
|
import { BEIJING_TIMEZONE, formatBeijingDateTime, beijingDateKey, beijingDateTimeInput, parseBeijingDateTimeInput, beijingDateBoundary, beijingDayStart, beijingWeekStart, beijingCalendarRange } from "../src/lib/beijing-time.ts";
|
||
|
|
|
||
|
|
test("Beijing display, date grouping and form round-trip ignore the browser timezone", () => {
|
||
|
|
const previous = process.env.TZ;
|
||
|
|
try {
|
||
|
|
for (const zone of ["Etc/UTC", "America/Los_Angeles", "America/New_York", "Asia/Tokyo"]) {
|
||
|
|
process.env.TZ = zone;
|
||
|
|
const at = new Date("2026-10-05T12:16:08Z");
|
||
|
|
assert.equal(BEIJING_TIMEZONE, "Asia/Shanghai");
|
||
|
|
assert.match(formatBeijingDateTime(at), /20:16:08/);
|
||
|
|
assert.equal(formatBeijingDateTime(at, { hour: "2-digit", minute: "2-digit", timeZone: zone }), "20:16");
|
||
|
|
assert.equal(beijingDateKey("2026-10-04T16:30:00Z"), "2026-10-05");
|
||
|
|
assert.equal(beijingDateTimeInput(at), "2026-10-05T20:16");
|
||
|
|
assert.equal(parseBeijingDateTimeInput("2026-10-05T20:16"), "2026-10-05T12:16:00.000Z");
|
||
|
|
assert.equal(parseBeijingDateTimeInput("2026-10-05T20:16:08.123"), "2026-10-05T12:16:08.123Z");
|
||
|
|
assert.equal(beijingDayStart(at).toISOString(), "2026-10-04T16:00:00.000Z");
|
||
|
|
assert.equal(beijingDateBoundary("2026-10-05", 1).toISOString(), "2026-10-05T16:00:00.000Z");
|
||
|
|
assert.deepEqual(beijingCalendarRange(30, new Date("2026-10-05T16:30:00Z")), {
|
||
|
|
from: "2026-09-06T16:00:00.000Z", to: "2026-10-05T16:30:00.000Z", timezone: "Asia/Shanghai",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
} finally {
|
||
|
|
if (previous === undefined) delete process.env.TZ; else process.env.TZ = previous;
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
test("Monday Beijing midnight resets the week, Tuesday midnight does not", () => {
|
||
|
|
assert.equal(beijingWeekStart(new Date("2026-10-04T15:59:59Z")).toISOString(), "2026-09-27T16:00:00.000Z");
|
||
|
|
assert.equal(beijingWeekStart(new Date("2026-10-04T16:00:00Z")).toISOString(), "2026-10-04T16:00:00.000Z");
|
||
|
|
assert.equal(beijingWeekStart(new Date("2026-10-05T16:00:00Z")).toISOString(), "2026-10-04T16:00:00.000Z");
|
||
|
|
assert.equal(beijingDateBoundary("2025-12-31", 1).toISOString(), "2025-12-31T16:00:00.000Z");
|
||
|
|
assert.equal(beijingDateBoundary("2028-02-28", 1).toISOString(), "2028-02-28T16:00:00.000Z");
|
||
|
|
});
|
||
|
|
|
||
|
|
test("invalid dates do not become a shifted date or an invented valid time", () => {
|
||
|
|
for (const value of [null, undefined, "", "not-a-date"]) {
|
||
|
|
assert.equal(formatBeijingDateTime(value), "—");
|
||
|
|
assert.equal(beijingDateKey(value), "");
|
||
|
|
assert.equal(beijingDateTimeInput(value), "");
|
||
|
|
}
|
||
|
|
for (const value of ["2026-02-29T10:00", "2026-10-05T24:00", "2026-10-05T20:99", "2026-10-05T20:16:60", "2026-10-05", "2026-10-05T20:16Z"]) {
|
||
|
|
assert.throws(() => parseBeijingDateTimeInput(value), RangeError);
|
||
|
|
}
|
||
|
|
assert.throws(() => beijingDateBoundary("2026-02-30"), RangeError);
|
||
|
|
assert.throws(() => beijingCalendarRange(0), RangeError);
|
||
|
|
});
|