Date / Time
Date: 同じ instant でもタイムゾーンで日付が異なる
Date は時刻の一点を持ち、表示上の日付はフォーマット時に選んだタイムゾーンで決まります。
SourcetimeZoneFormatting.ts
Node.js 22
export function dateInZone(instant: Date, timeZone: string): string {
const parts = new Intl.DateTimeFormat("en-CA", {
timeZone,
year: "numeric",
month: "2-digit",
day: "2-digit",
}).formatToParts(instant);
const year = parts.find((part) => part.type === "year")?.value;
const month = parts.find((part) => part.type === "month")?.value;
const day = parts.find((part) => part.type === "day")?.value;
if (!year || !month || !day) throw new Error("date parts are unavailable");
return `${year}-${month}-${day}`;
}TesttimeZoneFormatting.test.ts
Node.js 22
import assert from "node:assert/strict";
import test from "node:test";
import { dateInZone } from "../../src/datetime/timeZoneFormatting.js";
test("同じinstantはUTCとLosAngelesで日付が異なる", () => {
const instant = new Date("2026-08-27T00:30:00.000Z");
assert.equal(dateInZone(instant, "UTC"), "2026-08-27");
assert.equal(dateInZone(instant, "America/Los_Angeles"), "2026-08-26");
});01Assertion
このテストで確認できること
- 同じ Date を UTC で日付表示できる
- 同じ Date を America/Los_Angeles で前日として表示できる
日付だけの業務概念と instant を混同しないことが重要です。必要な粒度とタイムゾーンを API 境界で明示します。
OBSERVED RESULT
expected: UTC → 2026-08-27
actual: 2026-08-27
expected: Los Angeles → 2026-08-26