知識マップ: 業務アプリの日時とタイムゾーン ── DateTimeの罠からUTC保存の原則、テスト設計まで

記事「業務アプリの日時とタイムゾーン ── DateTimeの罠からUTC保存の原則、テスト設計まで」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

業務アプリの日時事故は、DateTimeが既定で持つKind=Unspecifiedの値にToLocalTime/ToUniversalTimeが黙って基準を仮定することに起因し、実行マシンのタイムゾーン設定に依存するため開発機では再現せずサーバー移設の日に9時間ずれとして顕在化する。対策はUTC保存の原則で、取得・保存・通信はDateTimeOffsetやUTCのDateTimeで統一し、ラウンドトリップ書式で境界を越え、ローカル時刻への変換は表示直前の1回に限る。TimeZoneInfoによる変換はKindとの整合を要求し、IANA IDの解決はWindows上ではICUに依存し、夏時間の切替日にはIsInvalidTime/IsAmbiguousTimeで異常な時刻を確認できる。SQL Serverのdatetime2列やEF Coreの値コンバーターはDB境界でのKind消失に対応し、TimeProviderを注入すれば年跨ぎやDST切替日のバグをテストで再現できる。

業務アプリの日時とタイムゾーン処理の知識マップDateTimeのKindが引き起こす9時間ずれ事故の構造と、UTC保存の原則がそれをどう防ぐか、TimeZoneInfoやDST、DBとの境界、TimeProviderによるテストとの関係を示す図原因になり得る防止する軽減する前提とする利用する利用する前提とするで確認できる原因になり得る軽減する利用する前提とする利用する原因になり得る軽減する原因になり得る前提とする利用する利用する利用する推奨される対応DateTimeのKindUTC保存の原則サーバー移設時の9時間ずれ事故DateTimeOffsetTimeZoneInfoIANAタイムゾーンIDWindowsタイムゾーンIDICU(International Components for Unicode)夏時間(DST)DST切替日の定期実行の多重実行・欠測ラウンドトリップ書式("o")業務日付とタイムスタンプの区別EF Coreの値コンバーターSQL Serverのdatetime2型DB読み出し時のKind消失NTP(Network Time Protocol)TimeProvider.NET(Core以降).NET Framework

概念間の関係(全21件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

DateTimeのKind
DateTimeが持つUtc/Local/Unspecifiedの3値の属性。既定はUnspecifiedで、変換メソッドがどちらの基準とみなすかが呼び出し先ごとに異なる。
UTC保存の原則
取得はUTC、保存と通信はUTCまたはオフセット付き、ローカル時刻への変換は画面・帳票に出す直前の1回だけに限るという日時処理の設計原則。
DateTimeOffset
日時に加えてUTCからのオフセットを常に持ち、値単体で世界のどの瞬間かが一意に決まる.NETの型。公式ガイダンスはこれをアプリケーション開発の既定の日時型として検討するよう明記している。
TimeZoneInfo
タイムゾーンの定義や夏時間の調整規則を扱い、UTCとローカル時刻を相互変換する.NETのクラス。
IANAタイムゾーンID
IANA tz databaseが定めるタイムゾーンの識別子。Linuxや海外SaaS、他言語との連携で共通に通じる。
夏時間(DST)
時計を進めて日照時間を有効活用する制度。切り替え日に、存在しない時刻と曖昧な時刻という2種類の異常な時刻を生む。
業務日付とタイムスタンプの区別
「7月3日の日報」のような業務日付と、世界で一意な時点を表すタイムスタンプを別の型・列として扱うべきという区別。業務日付は「どのタイムゾーンで日付を切るか」を仕様で決める必要がある。
EF Coreの値コンバーター
DB列の読み書き時にDateTimeを一括して正規化・Kind復元できるEF Coreの機能。読み出し時にKindをUtcへ明示的に復元できる。
SQL Serverのdatetime2型
基準情報を持たずUTCで保存する列の本命とされる、新規採用が推奨されるSQL Serverの日時型。
DB読み出し時のKind消失
datetime2やSQLiteのTEXTなど基準情報を持たない型からDateTimeを読み出すと既定でKind=Unspecifiedになり、保存時はUTCで統一していたはずの値に対して二重変換が起きる事故を招くこと。
.NET(Core以降)
.NET Frameworkの後継となる、クロスプラットフォーム対応の.NETランタイム(.NET 5以降)。
.NET Framework
Windowsのコンポーネントとして扱われ、インストールされているOSのライフサイクルに沿ってサポートされるランタイム。System.Messagingの対象範囲。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。