日本語 · English(未訳)

ADR-33: TZ の定義——射影パラメータモデル

判断: 用語 TZ・前文メンバー tz: を次のとおり定義する(F55。これまで頻出しながらどこにも定義が 無かった用語の明文化であり、既存の式の意味は変えない——その確認自体を本 ADR が担う)。

  1. 基底は一つ・TZ 非依存。chronos は TZ に依存しない単一の絶対連続時間軸である。従来の「TZ で 錨を打った時間軸」(I1・ADR-02)の「錨」は、基底の属性ではなく射影の錨と再定式化する。
  2. TZ とは chronos から市民座標への版付き写像である。市民座標=壁時計のラベル (YYYY-MM-DDThh:mm:ss)。写像は「chronos → UTC オフセット」の区分的定数関数(遷移は局所有限)で 与えられ、その部分逆写像が日付・時刻リテラルを chronos の点に落とす。tz: はこの写像の名前を 与える premise の文脈値(I6)であり、ストリームの要素はデータとして TZ を運ばない。
  3. 値の定義域: IANA tzdb の地域識別子("Asia/Tokyo")、固定オフセット表記("+09:00" 級)、 および "UTC"(tzdb では Etc/UTC へのリンク)。固定オフセットは遷移を持たない退化ケースで、 隙間・重複が原理的に無く言語仕様だけで完結する。地域識別子の指す写像は tzdb のに相対で、 版・出所の統治は既存の asof:/source: の管に載る(実装系が同梱する tzdb を既定とし、データ供給の 詳細はスコープ外連動——ADR-15/26 と同じ枠)。
  4. 市民日の定義: 市民日 D の窓は「写像の日付ラベルが D になる最初の瞬間」から「次に存在する 日付ラベルになる最初の瞬間」までの半開区間。真夜中が存在しない日(00:00 スキップの DST 遷移)・ 二度ある日でも窓は全域・無重複に定まる——「最初の瞬間」は日付ごとに狭義単調増加なので、day の パーティション性(I5)は日付ラベルの単調性が無くても構成的に立つ。写像の日付単調性は 「点の日付ラベル=その点が属する day 窓の日付」の一致条件に位置づける(史実にはラベルが逆行する 遷移が存在する——例: America/St_Johns の 00:01 切替。逆行区間の時刻付きリテラルは判断 6 の重複 エラーに落ち、黙って別の日に入ることはない)。ADR-31 の既定整列「市民時幅=tz 真夜中」はこの 「最初の瞬間」規則の通常形(ADR-31 に改訂節を追記)。
  5. chronos の尺度とうるう秒: chronos はうるう秒を持たない一様な理想化軸——UTC の各日を ちょうど 86,400 秒と数える(POSIX time・Java Time-Scale と同型。86,400 等分の対象は判断 2 の写像の 正準ラベルである UTC の日であって、TZ 相対の市民日ではない——市民日は DST で 23〜25 時間になり、 それは経過時間の側の事実である)。うるう秒は正負ともスコープ外、字句 23:59:60字句エラー。 経過時間幅 h/m/s はこの理想化秒を数える。(従来の「うるう秒のある日は 86401 秒」等の記述は 本 ADR で置き換える——spec §3.6 の「うるう秒で 23〜25 時間」は誤記でもあった。)
  6. 隙間・重複に落ちるリテラルは明示エラー(1.0): 時刻付きリテラル(anchor:from:・テーブル リテラルの要素を含む)は「写像の逆像が存在して一意」であることを要求し、DST の隙間(存在しない 02:30)・重複(二度ある 01:30)に落ちたらエラー(Temporal の reject・pytz の is_dst=None と 同型)。黙って別の点を返さない(ADR-16)。解決規約(隙間を Following で送る等=ロール規約 ADR-13 と 同形・重複の first/last=選択子と同形)は将来の opt-in メンバーとして口だけ確保し、1.0 では 導入しない。演算の結果が無効時刻に落ちる場合は従来どおりロール規約が担う(ADR-12/13。本項は リテラル=入力の規則)。
  7. 紀元の tz 相対性(ADR-31 の帰結の明文化): 紀元「1970-01-01T00:00(在圏 tz)」は写像の逆像で あり、tz が違えば chronos 上の別の点である。epochOrdinal・span の窓序数は premise 相対の 座標であり、premise を跨いだ序数の比較には意味がない(点の同一性は chronos 上の等値で判定する—— F56 の粒度整合規則へ接続)。紀元が隙間に落ちる TZ でも「最初の瞬間」規則で定まる。
  8. 統治の発火点: tz: は宣言必須寄り(既存の統治表どおり)で、要求駆動・利用時に発火する (wkst と同型)——日付リテラルの錨・市民時幅の gridsnapTo(day) 等、写像を要する評価が在圏で tz: を解決できなければエラー。tz: を使わない式は宣言なしで立つ(stdlib の Gregorian 定義自体は エラーにならない)。
  9. エラーの時期: tz 名の妥当性・隙間/重複判定は tz データ(版)に相対で、静的には決定できない ことがある。ADR-16 の「静的エラー」にデータ相対エラー(評価時・データの版に相対)を並置する (拡張であって矛盾ではない。covering: の「範囲外」出自と同じ層)。
  10. tz の同値と F54 の帰結: premise 間の tz 一致判定は名前の等値(写像の等値は版相対で不安定—— "Asia/Tokyo""+09:00" は 1948〜51 年の DST により写像として不一致。等値をリンク解決の前後 どちらで取るかは F56 の詳細設計で確定するが、判断の趣旨=版非依存からはリテラル文字列の等値が 整合的)。カレンダー実体 (§1.19)・データ入り premise(壁時計値のテーブルを持つもの。stdlib の Kyureki が実例)は tz:内側に固定し、利用側と食い違う合成は安全側=エラー、整合は snapTo で明示する(詳細規則は F56 の粒度整合と一体で別途設計)。

図解(2026-07-13 追補・判断 2/4/6 の要約——判断内容の変更なし):

flowchart LR
  T["chronos の点 t<br/>(単一の絶対軸・TZ 非依存・<br/>うるう秒なしの理想化=判断 5)"]
  T -- "写像 tz(版付き・区分的定数=判断 2)" --> L["市民座標のラベル<br/>YYYY-MM-DDThh:mm(壁時計)"]
  L2["日付・時刻リテラル"] -- "部分逆写像(リテラルの錨)" --> Q{"逆像は存在して一意?"}
  Q -- "一意" --> T2["chronos の点に確定"]
  Q -- "存在しない(DST の隙間 02:30)" --> E["明示エラー(判断 6・1.0)<br/>黙って別の点を返さない"]
  Q -- "二つある(DST の重複 01:30)" --> E
  L -. "市民日 D の窓=「ラベルが D になる最初の瞬間」から<br/>「次の日付ラベルの最初の瞬間」まで(半開・判断 4)" .-> D["day 窓(パーティション性 I5 は構成的に成立)"]

背景: レビュー(2026-07-07・F55)で「TZ は統治表・I1・ADR-28/31 が前提するのに正体の定義が無い」 と裁定された。棚卸しの結果、依存は 9 系統(chronos の錨・日付リテラル・grid 位相・紀元・市民日幅・ 統治・文字列値・I6・データ premise)に及び、最大の緊張は ADR-02「基底にタイムゾーンが第一級で入る」の 字面と ADR-28「同じリテラルが premise(tz:)により基底上の別の点を指すのは仕様」の確定事項が両立して いないことだった。ADR-19 は既に「TZ 変換=premise の基底の錨(地理座標)を打ち直す」と射影側の読みを 示しており、I6(TZ は評価文脈)とも射影パラメータモデルだけが整合する。実例: 2027 年の朔 2027-02-07 00:56 JST は中国標準時では 2027-02-06 23:56——「旧暦はどの TZ の市民日で切るか」で春節の 日付が割れる(95-reference-data)。これは写像が premise 相対であることの帰結であり、バグではない。

却下した案:

帰結:

改訂(2026-07-09・ADR-43)