esspec

第92回 ECMAScript仕様輪読会

1. 前回の振り返り(Time Zone関連)

前回のセッションでは、日時(Date/Time)に関する基本的な定義やTime Zoneの導入部分を確認しました。

次回(今回)は GetNamedTimeZoneEpochNanoseconds から読み進めることになっていました。


2. GetNamedTimeZoneEpochNanoseconds (抽象操作)

この操作は実装定義(Implementation Defined)であり、名前付きタイムゾーンにおける特定の日時(壁時計時間)に対応するエポックナノ秒を取得します。

定義と引数

GetNamedTimeZoneEpochNanoseconds(
  timeZoneIdentifier, // String
  year, month, day,   // Integers (month, dayは inclusive interval: 1-12, 1-31)
  hour, minute, second,
  millisecond, microsecond, nanosecond
)

戻り値のリストが複数要素または空になるケース(夏時間の影響)

入力された「ローカル時間(壁時計時間)」の解釈には以下のパターンがあります。

  1. 重複する時間(Repeat):
    • 状況: 夏時間(DST)の終了時や、タイムゾーンルールの変更でオフセットが減少(時間が戻る)する場合。
    • 結果: 同じローカル時間が1回より多く発生するため、複数の要素を持つリスト(数値の昇順ソート済み)を返す。
  2. 存在しない時間(Skip):
    • 状況: 夏時間の開始時や、タイムゾーンルールの変更でオフセットが増加(時間が進む)する場合。
    • 結果: 該当する時間はスキップされるため、空のリストを返す。
  3. 通常:
    • それ以外の場合は、1つの要素のみを持つリストを返す。

具体例(America/New_York の場合)

デフォルト実装(タイムゾーン非認識の場合)

タイムゾーンの政治的ルール(Local Political Rules)を持たない実装の場合の振る舞い:

  1. timeZoneIdentifier が “UTC” であると断定(Assert)する。
  2. 引数から単純にUTCのエポックナノ秒を計算して返す(タイムゾーン考慮なし)。

3. GetNamedTimeZoneOffsetNanoseconds (抽象操作)

指定されたエポックナノ秒時点での、UTCからのオフセットを返します。


4. TimeZoneIdentifierRecord (仕様上の型)

AvailableNamedTimeZoneIdentifiers が返すリストの要素として使用されるレコード型です。

Record(レコード)についての解説

テーブル62: TimeZoneIdentifierRecord のフィールド

フィールド名 説明
[[Identifier]] 実装がサポートする利用可能な名前付きタイムゾーン識別子(String)。
[[PrimaryIdentifier]] [[Identifier]] に対応するプライマリ(正規化された)タイムゾーン識別子。

5. AvailableNamedTimeZoneIdentifiers (抽象操作)


6. SystemTimeZoneIdentifier (抽象操作)

ホスト環境の現在のタイムゾーンを表す文字列を返します。

アルゴリズム

  1. 実装がUTCのみサポートする場合: “UTC” を返す。
  2. ホスト環境のタイムゾーン文字列表現を取得する。これは「Primary Time Zone Identifier」または「Offset Time Zone Identifier」のいずれかである。
  3. 取得した文字列を返す。

Offset String の形式

推奨事項 (Note)


7. LocalTime (抽象操作)

UTCの時刻値(Time Value)をローカル時刻(数値)に変換します。

定義

LocalTime(t)

アルゴリズム

  1. timeZoneIdentifier = SystemTimeZoneIdentifier()
  2. offsetNs(オフセットナノ秒)を取得:
    • 識別子がオフセット文字列なら、それをパースして設定。
    • そうでなければ、GetNamedTimeZoneOffsetNanoseconds を呼び出し、t(ミリ秒)をナノ秒($10^6$倍)に換算して渡す。
  3. offsetMs = offsetNs / $10^6$ (切り捨て)
  4. 戻り値 = t + offsetMs

8. UTC (抽象操作)

ローカル時刻(数値)をUTCの時刻値(Time Value)に変換します。LocalTime の逆操作ですが、複雑です。

定義

UTC(t)

アルゴリズム(途中まで確認)

  1. t が有限でなければ NaN を返す。
  2. timeZoneIdentifier = SystemTimeZoneIdentifier()
  3. オフセット文字列なら単純計算。
  4. そうでない場合(名前付きタイムゾーン):
    • possibleInstants = GetNamedTimeZoneEpochNanoseconds(..., tの各要素)
    • これはリストを返す(0個、1個、または2個の要素)。

重複・欠落時の解決ロジック (Note & Step)


余談・議論ポイント


次回予定