日本語

開発者ツール · 構文コンバーター

TOML にはネイティブ日時型があり、JSON には存在しない理由 (RFC 3339)

· 背景

トムル json タイムスタンプ

ゾーン発明なしで引用符で囲まれた JSON 文字列に絞り込まれる 4 つの TOML 時間値
オリジナル ToolAcre ベクトル イラスト

TOML は、このグループ内でファーストクラスの日付と時刻を含む唯一の形式であり、すべて RFC 3339 によって定義されています。この投稿では、4 つの TOML 日付/時刻型、JSON に意図的に日付/時刻型がない理由、および変換とそれらの関係について説明します。

文字列になった日付 — リリース日を含む TOML 構成が JSON に変換され、テキストに変換されます。

`1979-05-27` などの TOML ローカル日付は、JSON 文字列 `"1979-05-27"` になります。カレンダーの文字は残りますが、ネイティブの TOML 型は残りません。その JSON を逆変換すると、日付トークンではなく引用符で囲まれた文字列が書き込まれ、ToolAcre は最初の変換時に警告を出します。

これは、選択されたプレーンな JSON 値における避けられない境界です。ラウンドトリップをロスレスと呼ぶと、保存されたテキストと保存されたタイプが混同されます。警告ではパスと一時的な種類の両方に名前が付けられるため、レビュー担当者は文字列が下流で受け入れられるかどうかを判断できます。

JSON に日付型がない理由 — Crockford のミニマリズム、ISO 8601 文字列規則、およびギャップを埋めるために競合するエポックからのミリ秒規則

JSON ここで解析すると、null、ブール値、数値、文字列、配列、オブジェクトが生成されます。 Date オブジェクトは生成されません。リポジトリはその実装事実を証明していますが、JSON のミニマリズムや競合する業界の慣例に関する歴史的な説明は提供されていません。

アプリケーションは合意に基づいて ISO のような文字列またはエポック番号を採用する場合がありますが、それらは JSON に重ねられた規則です。構文コンバーターは、任意のテキストから構文を推論したり、TOML 時間値をエポック演算に変換したりしません。

JSON には、このコンバーターにはネイティブの日付型がありません。起源の根拠はリポジトリの証拠の外にあります

TOML は、Z または数値オフセットを使用したオフセット日付/時間、ゾーンなしのローカル日付/時間、ローカル日付、およびローカル時間の 4 種類を公開します。 smol-toml は、種類のメタデータを保持する日付のようなオブジェクトとしてそれらを表します。 ToolAcre は正規化する前にそれぞれを識別します。

区別することで重大な間違いを防ぐことができます。現地時間には UTC が自動的に割り当てられることはなく、現地の日付/時間がゾーン間で移動されることもありません。存在しないオフセットは JSON 文字列に存在しないままになります。

基盤としての RFC 3339 — TOML が借用する ISO 8601 のプロファイル (スペース区切り文字の許容を含む)

ノーマライザーはパーサー値の ISO フォーマッタを呼び出し、合成 `.000` 部分のみを削除します。意味のある小数秒と、ソース指向のローカル対オフセット形式が保持されます。コードではこれを RFC 3339 テキストとして説明していますが、この記事ではテストされた出力を超えて区切り文字の許容量などの仕様条項を考案していません。

オフセットの例は、このレイヤーによってユニバーサル Z 値に変換されるのではなく、日時テキストのままです。これにより、書かれた表現の変更が回避され、それを所有するアプリケーションの一時的な解釈が維持されます。

ToolAcre は、完全な RFC 3339 準拠の詳細を主張せずに、ソース指向の時間テキストを保持します。

すべての時間値は文字列になり、この変換モデルでは JSON、YAML、および XML には日付型がないという警告が表示されます。オフセットは意図的に削除されず、ローカル値はオフセットを取得しません。失われた情報は、TOML タイプ カテゴリそのものです。

逆変換では、ライターには日時を復元するように指示するマーカーがないため、文字列は引用符で囲まれます。日付のように見える任意の文字列を日付として再解析すると、通常の識別子またはラベルが誤って入力され、JSON で共有されていない規則が作成されてしまいます。

コンバーターはローカル スペルとオフセット スペルを保持しますが、ネイティブ TOML タイプは失われます。

`odt = 1979-05-27T07:32:00Z`、`ldt = 1979-05-27T07:32:00`、`ld = 1979-05-27`、`lt = 07:32:00` を使用します。 JSON には、これらのスペルを含む 4 つの文字列が含まれています。警告には、オフセット日付/時間、ローカル日付/時間、ローカル日付、およびローカル時間のパスがリストされます。

JSON を TOML に変換します。各値は引用符で囲まれています。小数部の `00.500Z` は小数部のままですが、整数秒の値は `.000` を獲得しません。これは実際にサポートされている動作であり、保存されたテキストと失われた型を明確に示しています。

動作する例: 4 つの TOML 時間的種類はすべて文字列になり、引用符で囲まれて返されます。

タイムゾーン ルールの検索、夏時間への移行、およびエポック変換は、このルートの一部ではありません。ゾーンのないローカル日時は、さらなる情報がなければ 1 つの固有の瞬間になることはできません。 Unix タイムスタンプ コンバータは、別の規約に基づいて既知の瞬間に対処します。

結果として得られるすべての文字列を JavaScript Date にフィードし、同等の意味を想定しないでください。ローカル日付、ローカル時刻、ゾーンレス日付時刻にはアプリケーション コンテキストが必要です。移行を通じて警告とフィールドのセマンティクスを保持します。

要点: TOML は日付が何であるかを知っていますが、JSON は文字列が何であるかだけを知っています。また、その違いがブラウザーで構文コンバーター パネルにどのように表示されるかがわかります。

TOML は 4 つの時間的カテゴリを認識します。 JSON はここで文字列のみを受け取ります。 ToolAcre はスペルを注意深く保持し、ゾーンの作成を拒否しますが、ネイティブ タイプは失われており、戻ったときに自動的に再構築することはできません。

警告されたすべてのパスを確認し、時間セマンティクスが存続する必要がある場合のアプリケーション規則を定義します。そのような規則が存在しない場合は、引用符で囲まれた往復を同等のものとして扱うのではなく、TOML を信頼できるソースとして保持してください。

音声規則では、どの文字列をどのようなコンテキストで再度解析できるかについても指定します。オフセット日付/時刻は瞬間を識別できますが、ローカル日付/時刻、日付、または時刻は追加のルールがなければ識別できません。後の段階で TOML を再構築したり、作業をスケジュールしたりする必要がある場合は、正規化された文字列の横に元の種類を保存します。それ以外の場合は、JSON が表示テキストを保持していることを受け入れ、それをサイレントにユニバーサル タイムスタンプに昇格させることは避けてください。