本セッションでは、前回に引き続き「21.4 Date Objects」の仕様を確認しました。主に Date.UTC 関数から Date.prototype の各メソッド(Getter/Setter、文字列変換)について、仕様のアルゴリズムと実際の挙動をコードで検証しながら読み進めました。
前回確認した以下の内容を軽く復習しました。
NumericStringGrammar: 文字列を数値として解釈するための文法。Date コンストラクタの挙動(関数として呼ばれた場合とコンストラクタとして呼ばれた場合の違い)。Internal Slot ([[DateValue]]) や Realm(グローバル環境)の概念。Date.UTC は、引数をUTCとして解釈し、対応するタイムバリュー(数値)を返します。
ToNumber を適用する。month がなければ 0。date がなければ 1(Dateのみ1オリジン)。0。MakeFullYear, MakeDay, MakeTime, MakeDate という内部操作を経て値を生成する。TimeClip: 生成された値がDateオブジェクトで表現可能な範囲(約±285,426年)に収まっているかを確認し、範囲外なら NaN を返す。Date コンストラクタは新しいDateオブジェクトを生成するが、Date.UTC は数値を返す。Date コンストラクタ(引数が複数の場合)は引数をローカルタイムとして解釈するが、Date.UTC はUTCとして解釈する。// 検証:範囲外の年は NaN になる
Date.UTC(275760, 8, 13); // 数値が返る
Date.UTC(285427, 0, 1); // NaN (TimeClipによる)
Date.prototype 自体の特性について確認しました。
writable: false, enumerable: false, configurable: false。
configurable が false であるため、プロパティの再定義や削除は一切不可。[[DateValue]] 内部スロットを持たず、自身のメソッドを自身に対して呼ぶことはできない。Date.prototype のメソッドは原則として「ジェネリックではない」。this が [[DateValue]] 内部スロットを持つ(=Dateインスタンスである)ことを要求し、持たない場合は TypeError を投げる。各Getter(getDate, getHours, getTime など)の共通アルゴリズムを確認しました。
this を Date オブジェクトとして受け取る。this が [[DateValue]] 内部スロットを持っているかチェック(RequireInternalSlot)。なければ TypeError。t とする。t が NaN なら NaN を返す。LocalTime(t) (ローカルタイムへの変換)を適用した上で、必要な要素(日、時など)を抽出して返す。内部スロット [[DateValue]] の値をそのまま返す(変換なし)。
UTCとローカルタイムの差分を「分」で返します。
(t - LocalTime(t)) / msPerMinutet - (t + 9h) となるため、結果は -540 となる。// 検証
new Date().getTimezoneOffset(); // 日本なら -540
各Setter(setDate, setFullYear, setTime など)の挙動を確認しました。
特定の「日」を設定します。
0 や負の数、あるいはその月の末日を超える数値を渡すと、適切に前後の月に繰り越される。0 を設定すると「前月の最終日」になる。const d = new Date(2026, 0, 1); // 2026-01-01
d.setDate(32); // 2026-02-01 になる
d.setDate(0); // 2026-01-31 になる(2月の0日=1月の最終日)
年を設定するメソッドですが、オプションで月と日も同時に設定可能です。
setHours なら分・秒・ミリ秒)をオプションで受け取れるよう設計されています。内部スロット [[DateValue]] を直接書き換えます。
ToNumber し、TimeClip を適用した値を設定する。TimeClip の範囲を超えた場合、NaN(Invalid Date)が設定される。日付部分のみを人間が読める形式の文字列で返します(例: “Sun Mar 01 2026”)。
ISO 8601形式の文字列を返します。
NaN の場合、RangeError を投げる。+0275760-09-13T00:00:00.000Z)も表現可能。JSON.stringify で呼ばれるためのメソッドです。
this をオブジェクトに変換する。ToPrimitive をヒント「Number」で呼び出す。NaN や Infinity)場合は null を返す。toISOString() メソッドを呼び出した結果を返す。特徴:
this が Date インスタンスである必要はなく、toISOString という名前のメソッドを持ってさえいれば動作する。// 検証:ジェネリックな挙動
const obj = {
toISOString: () => "Custom ISO String",
toJSON: Date.prototype.toJSON
};
console.log(obj.toJSON()); // "Custom ISO String"
// 数値として不正な場合は null
const invalidDate = new Date(NaN);
console.log(invalidDate.toJSON()); // null
次回のセッションでは、Date.prototype.toLocaleDateString から読み進める予定です。