本格的な読み合わせに入る前に、前回(ES2026に含まれる予定の機能など)の振り返りが行われました。
ここから今回のメインコンテンツである仕様の読み合わせが開始されました。以下の定数は、後続のセクションのアルゴリズムで参照されます。
| 定数名 | 値 | 説明 |
|---|---|---|
HoursPerDay |
24 | 1日の時間数 |
MinutesPerHour |
60 | 1時間の分数 |
SecondsPerMinute |
60 | 1分の秒数 |
msPerSecond |
1000 (1000𝔽) |
1秒のミリ秒数 |
msPerMinute |
60000 (60000𝔽) |
1分のミリ秒数 |
msPerHour |
3600000 (3600000𝔽) |
1時間のミリ秒数 |
msPerDay |
86400000 (86400000𝔽) |
1日のミリ秒数 |
𝔽 は、これが Mathematical Value ではなく、ECMAScript上の Number型 であることを明示している。HoursPerDay など 𝔽 がついていないものは Mathematical Value として扱われる。有限のTime Value t (ミリ秒) を受け取り、エポック(1970年1月1日)からの経過日数を返します。
floor(R(t) / msPerDay)
t はNumber型だが、R(t) でMathematical Valueに変換し、msPerDay で割って床関数(floor)を適用する。t が「該当する(falls on)」日を表す数値を返す。その日の始まりから経過したミリ秒数を返します。
R(t) modulo msPerDay
+0𝔽 から msPerDay (含まない) までの整数。ある年 y が何日あるかを返します(365 または 366)。
y が400で割り切れるなら 366y が100で割り切れるなら 365y が4で割り切れるなら 366年 y の1月1日が、エポックから何日目にあたるかを計算します。
y - 1970 は経過年数。年 y の開始時刻(ミリ秒)を返します。
msPerDay × DayFromYear(y)
時刻 t が属する「年」を返します。
TimeFromYear(y) <= t を満たす最大の整数 y。時刻 t がその年の中で何日目か(0始まり)を返します。
Day(t) - DayFromYear(YearFromTime(t))
時刻 t がうるう年に属するかどうかを返します。
1、そうでなければ 0。1/0 なのか? → 後続の MonthFromTime の計算式で数値として扱うため(日数の加算に使用される)であることが判明。時刻 t が属する「月」を返します(0 = 1月, 11 = 12月)。
DayWithinYear(t) の値と InLeapYear(t) の結果を用いて判定する。InLeapYear(t) なら 1 (2月) …struct tm に由来する古い慣習)がここでも確認された。DateFromTime(t)(日付を返す操作)は1始まり(1-31)であり、月と日でインデックスの始まりが違うことへの言及があった。時刻 t の曜日を返します(0 = 日曜日 〜 6 = 土曜日)。
(Day(t) + 4) modulo 7
+4 して調整している(日曜=0 とするため)。以下の操作は、時刻 t から各単位の値を抽出します。
floor((t / msPerHour) modulo HoursPerDay)floor((t / msPerMinute) modulo MinutesPerHour)floor((t / msPerSecond) modulo SecondsPerMinute)t modulo msPerSecond(新しいTemporal APIなどに関連する)年、月、日、時、分、秒、ミリ秒、マイクロ秒、ナノ秒を受け取り、UTCエポックからのナノ秒単位の経過時間をBigIntで返す操作。
year, month (1-12), day, … nanosecondMakeDay, MakeTime, MakeDate を使用してミリ秒までのタイムスタンプを計算。10^6 倍してナノ秒に換算。10^3倍)とナノ秒を加算する。MakeDay などの古い操作は月を0-11で扱うが、この GetUTCEpochNanoseconds のインターフェースや新しい仕様(Temporalなど)では月を1-12で扱うことが多く、内部で month - 1 するなどの調整が行われている点がややこしい。0x00 (NUL) から 0x007F (DEL) までのコードユニット(ASCII文字)で構成される文字列。+09:00 のような固定オフセットを表す文字列(IsTimeZoneOffsetString で判定される)。Asia/Tokyo, UTC)。Japan などのリンクやエイリアス)。UTC をサポートしなければならず、UTC は Primary Time Zone Identifier でなければならない。JST は Primary なのか? という疑問に対し、Asia/Tokyo が Primary(Zone Name)であり、JST は省略形(Abbreviation)であって、ここでの Identifier の定義(Zone or Link)には当てはまらないのではないか、という確認が行われた。Zone(地域名)と Link(別名)の関係が、ECMAScript仕様上の Primary と Non-Primary にマッピングされていることが確認された。ここで時間が来たため、次回は GetNamedTimeZoneEpochNanoseconds から読み進めることとなり、終了しました。