ADR-33: TZ の定義——射影パラメータモデル
判断: 用語 TZ・前文メンバー tz: を次のとおり定義する(F55。これまで頻出しながらどこにも定義が
無かった用語の明文化であり、既存の式の意味は変えない——その確認自体を本 ADR が担う)。
- 基底は一つ・TZ 非依存。chronos は TZ に依存しない単一の絶対連続時間軸である。従来の「TZ で 錨を打った時間軸」(I1・ADR-02)の「錨」は、基底の属性ではなく射影の錨と再定式化する。
- TZ とは chronos から市民座標への版付き写像である。市民座標=壁時計のラベル
(
YYYY-MM-DDThh:mm:ss)。写像は「chronos → UTC オフセット」の区分的定数関数(遷移は局所有限)で 与えられ、その部分逆写像が日付・時刻リテラルを chronos の点に落とす。tz:はこの写像の名前を 与える premise の文脈値(I6)であり、ストリームの要素はデータとして TZ を運ばない。 - 値の定義域: IANA tzdb の地域識別子(
"Asia/Tokyo")、固定オフセット表記("+09:00"級)、 および"UTC"(tzdb ではEtc/UTCへのリンク)。固定オフセットは遷移を持たない退化ケースで、 隙間・重複が原理的に無く言語仕様だけで完結する。地域識別子の指す写像は tzdb の版に相対で、 版・出所の統治は既存のasof:/source:の管に載る(実装系が同梱する tzdb を既定とし、データ供給の 詳細はスコープ外連動——ADR-15/26 と同じ枠)。 - 市民日の定義: 市民日 D の窓は「写像の日付ラベルが D になる最初の瞬間」から「次に存在する
日付ラベルになる最初の瞬間」までの半開区間。真夜中が存在しない日(00:00 スキップの DST 遷移)・
二度ある日でも窓は全域・無重複に定まる——「最初の瞬間」は日付ごとに狭義単調増加なので、
dayの パーティション性(I5)は日付ラベルの単調性が無くても構成的に立つ。写像の日付単調性は 「点の日付ラベル=その点が属する day 窓の日付」の一致条件に位置づける(史実にはラベルが逆行する 遷移が存在する——例: America/St_Johns の 00:01 切替。逆行区間の時刻付きリテラルは判断 6 の重複 エラーに落ち、黙って別の日に入ることはない)。ADR-31 の既定整列「市民時幅=tz 真夜中」はこの 「最初の瞬間」規則の通常形(ADR-31 に改訂節を追記)。 - 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 時間」は誤記でもあった。) - 隙間・重複に落ちるリテラルは明示エラー(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。本項は リテラル=入力の規則)。 - 紀元の tz 相対性(ADR-31 の帰結の明文化): 紀元「1970-01-01T00:00(在圏 tz)」は写像の逆像で
あり、tz が違えば chronos 上の別の点である。
epochOrdinal・span の窓序数は premise 相対の 座標であり、premise を跨いだ序数の比較には意味がない(点の同一性は chronos 上の等値で判定する—— F56 の粒度整合規則へ接続)。紀元が隙間に落ちる TZ でも「最初の瞬間」規則で定まる。 - 統治の発火点:
tz:は宣言必須寄り(既存の統治表どおり)で、要求駆動・利用時に発火する (wkst と同型)——日付リテラルの錨・市民時幅のgrid・snapTo(day)等、写像を要する評価が在圏でtz:を解決できなければエラー。tz:を使わない式は宣言なしで立つ(stdlib のGregorian定義自体は エラーにならない)。 - エラーの時期: tz 名の妥当性・隙間/重複判定は tz データ(版)に相対で、静的には決定できない
ことがある。ADR-16 の「静的エラー」にデータ相対エラー(評価時・データの版に相対)を並置する
(拡張であって矛盾ではない。
covering:の「範囲外」出自と同じ層)。 - 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 相対であることの帰結であり、バグではない。
却下した案:
- 基底内蔵モデル(ADR-02 の字面どおり基底が TZ を内蔵する)。premise ごとの
tz:(ADR-28 の確定 事項)と正面衝突し、東京と NY の営業日の積のような多 TZ 合成が立たない。 - 隙間・重複の解決規約を 1.0 で導入する案。表現力(DST 圏の「毎日 02:30」)は上がるが、既定の 選択責任が重く(Java は隙間で前方シフト・PostgreSQL は重複で遅い方、と業界規約自体が割れている)、 ADR-16 の基準では「既定で黙って解決」は取れない。reject 既定+将来 opt-in が最小。
- 既定ロールで黙って解決する案(java.time 型)。黙って別の点を返すのは ADR-16 の危険基準そのもの。
- chronos を SI 秒の一様軸とする案(うるう秒は市民日幅 86401s が吸収)。実装(Unix ms)と恒久乖離
し、
h/m/s幅がうるう秒をまたぐときの規定が別途要る。Kairos の実データ(暦要項)は分精度で あり、理想化の実害がない。なお火星暦の1 sol = 88775 SI 秒(ADR-19)のような別スケールの暦日 システムは、基底は単一のまま(ADR-19「新しい基底ではない」)その暦の日を等分する同型の理想化で読む。 - リテラルへの TZ 指定子。ADR-28 で却下済み(二重供給の危険)。本 ADR は再確認のみ。
帰結:
- I1・spec 背骨・glossary の「TZ で錨を打った時間軸」は「単一の絶対軸+premise 相対の射影の錨」へ 字面を現況更新する(意味論不変)。glossary に「TZ」の項を新設。
- spec §3.6 の「市民日は DST・うるう秒で 23〜25 時間」・stdlib/gregorian.md の「うるう秒のある日は 86401 秒」は本 ADR の理想化に合わせて修正(うるう秒はスコープ外の項へ移す)。
- ADR-31 に改訂節(市民日開始の「最初の瞬間」一般化・紀元の隙間規則・値式
div/modの負数は floor と明文化=F63)。 - F54 は本 ADR の帰結(名前等値・実体側固定・snapTo 明示整合)として方向確定、詳細規則は F56 と一体で
設計する。stdlib の Kyureki は完全定義に
tz: "Asia/Tokyo"を固定する改訂を行う。 - リファレンス実装は「固定オフセットのみ対応の部分実装」として本定義に適合(前文
tz:メンバーの評価は 未実装=既知の制約として明記を維持)。字句の時刻検査(23:59:60拒否)は実装する。
改訂(2026-07-09・ADR-43)
- 固定オフセット表記の正準形を確定(F66 (b)・判断 10 の「
"+09:00"級」の精密化):"±HH:MM"(ゼロ埋め必須・HH 00–14・MM 00–59)のみ合法。"+9:00"・"+0900"・"Z"・"UTC+9"級は字句エラー・UTC は IANA 名"UTC"。ADR-36 判断 6(tz 名のリテラル字面等値)が 依存する一意性の充足。詳細は ADR-43 判断 2。