`Date`の日付ズレと`Temporal`
JavaScriptのDateオブジェクトの日付ズレ
カレンダーで2026-04-14 を2026-04-13 に
これはDate がtoISOString() などでDateには、
const d = new Date(2026, 3, 14); // Wed Apr 14 2026 00:00:00 GMT+0900 (日本標準時)
d.toISOString(); // 2026-04-13T15:00:00.000Z
そのDate のままではなくYYYY-MM-DD のような
例: nuqsを利用している場合
nuqsは、
parseAsIsoDate
nuqsのtoISOString()が
カスタムパーサーを書く
nuqs はcreateParser でtoISOString() をgetFullYear() などで
import { createParser } from "nuqs";
const ISO_DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
export const parseAsLocalIsoDate = createParser({
parse: (v) => {
const head = v.slice(0, 10);
if (!ISO_DATE_RE.test(head)) return null;
const [y, m, d] = head.split("-").map(Number);
const date = new Date(y, m - 1, d);
if (date.getFullYear() !== y || date.getMonth() !== m - 1 || date.getDate() !== d) {
return null;
}
return date;
},
serialize: (v: Date) => {
const y = v.getFullYear();
const m = String(v.getMonth() + 1).padStart(2, "0");
const d = String(v.getDate()).padStart(2, "0");
return `${y}-${m}-${d}`;
},
eq: (a, b) => a.valueOf() === b.valueOf(),
});
Temporal API
※ Temporal は
Temporal オブジェクトは、
組み込みの タイムゾーンおよび暦の 表現、 実時刻の 変換、 算術演算、 書式化など、 さまざまな シナリオで 日付と 時刻の 管理を 可能にします。 これは、 Date オブジェクトを 完全に 置き換える ものと して 設計されています。 (https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Temporal)
TemporalにはTemporal.PlainDateが
const d = new Date(2026, 3, 14); // Tue Apr 14 2026 00:00:00 GMT+0900 (日本標準時)
const plainDate = date.toTemporalInstant().toZonedDateTimeISO("Asia/Tokyo").toPlainDate();
console.log(plainDate.toString()); // 2026-04-14