前回の振り返りを経て、Time Zone Offset String Formatの仕様確認から開始されました。
StringStringToNumberなどで利用)。+ または -)HourSubComponents(分、秒、小数点以下)文法定義において、パラメータ(Extendedなど)による生成規則の制御について議論されました。
Extendedありの場合:
:)が含まれる形式。+HH:mm:ss.sssExtendedなしの場合:
+HHmmss.sssDateコンストラクタでパースできるのかについては疑問が呈されました。Date.parse や new Date() に様々なフォーマットを渡して挙動を確認。
Invalid Dateになる場合がある。ParseTimeZoneOffsetString)での利用を想定している可能性が高い。Date.parse自体は、このフォーマットの厳密な適用よりも、実装依存のフォールバックやヒューリスティックな解釈を含んでいる。Dateコンストラクタの仕様読み合わせに入りました。
仕様書内で登場する %Date% という表記に関連して、Intrinsic Objects(固有オブジェクト)と Realm(レルム)についての解説が行われました。
iframeは別のRealmを持つ。Arrayとiframe内のArrayは別のオブジェクト(アイデンティティが異なる)となり、instanceofなどが意図通り動かないケースがある。Dateは関数としても、コンストラクタ(new付き)としても呼び出せます。
NewTarget is undefined)
Date.prototype.toString相当)。new Date(...))
new Date()):
[[DateValue]] に設定する。new Date(value)):
value が Dateオブジェクトの場合: その [[DateValue]] をコピーする。ToPrimitive(value) を行う。
Date.parse と同じアルゴリズムでパースする。TimeClipで有効範囲に丸められる)。new Date(year, month, ...)):
year, month は必須。それ以降(date, hours, minutes, seconds, ms)は省略可能。date: 1year が 0〜99 の場合、1900を加算して 1900〜1999年として扱う(レガシーな挙動)。MakeDate, MakeTime を経て最終的な FinalDate を計算し、[[DateValue]] に設定する。[[DateValue]]: Dateオブジェクトが持つ唯一のデータ(エポックからのミリ秒)。タイムゾーン情報は持たない(表示時にシステムのタイムゾーンが使われる)。class MyDate extends Date のように継承する場合、super() コールは必須。これを行わないと [[DateValue]] などの内部スロットが初期化されず、インスタンスとして不整合になる。Dateコンストラクタ自身が持つプロパティについて。
Date.prototype: プロトタイプオブジェクト。Date.length: 7(引数の最大数)。Date.now():
文字列を日付に変換するメソッド。
ToString を適用。NaN を返す。0100:00:00.000Zやオフセット)がない場合:
2023-01-01): UTC として解釈される。2023-01-01T00:00): ローカルタイム として解釈される。あるDateオブジェクト x において、ミリ秒が0である場合、以下の式は同じ数値を生成すべきである(推奨)。
x.valueOf()Date.parse(x.toString())Date.parse(x.toUTCString())Date.parse(x.toISOString())ただし、Date.parse(x.toLocaleString()) については、同じ値を生成することは求められていない(フォーマットが多様であり、パースできない場合も多いため)。
Date.prototype から開始。