設定ファイル内で日付や時刻を管理する際、文字列としての扱いになりがちなJSONやYAMLでは、フォーマットの不統一やパーサー間の互換性エラーが問題になりやすい。TOML(Tom's Obvious, Minimal Language)では、RFC 3339に基づいた日付・時刻型がネイティブでサポートされており、型安全かつ明確なデータマッピングが可能である。
TOMLにおける4つの日付時刻型
TOML仕様では、用途に応じて使い分けるための4種類の時刻データ型が定義されている。秒部分は省略可能で、その場合は:00として扱われる。
| 型名 | フォーマット | 主な用途 | 記述例 |
|---|---|---|---|
| Offset Date-Time | タイムゾーンオフセット付き | グローバルな日時の特定 | 2024-05-10T09:00:00Z |
| Local Date-Time | タイムゾーンなし | ローカル環境依存の日時 | 2024-05-10T09:00:00 |
| Local Date | 日付のみ | 特定日のマーキング | 2024-05-10 |
| Local Time | 時刻のみ | 日次の定期実行など | 09:00:00 |
Offset Date-Timeによる絶対的な時刻表現
タイムゾーンオフセット(Zまたは±hh:mm)を含む完全な日時表現。日付と時刻の区切り文字としてTの代わりに半角スペースを使用可能である。
# タイムゾーン付き日時 (UTC+9)
publish_at = 2024-05-10T09:00:00+09:00
# UTC指定
maintenance_window = 2024-01-15 04:00:00Z
# 秒を省略した簡易記法
created_ts = 2024-03-01T12:00Z
この型は、クロスリージョンでのシステムデプロイや、国際的なイベントの開始時間など、世界中どこでも同一の瞬間を指し示す必要がある場合に適している。
Local Date-Timeによるローカル時刻の管理
オフセット情報を持たない日時。サーバーのローカルタイムに依存する処理などで用いられる。
# ローカルタイムのバッチ実行時刻
batch_run = 2024-05-01T23:00:00
# 空白区切りで秒を省略
next_scan = 2024-05-02 08:15
タイムゾーン情報が欠落しているため、異なるタイムゾーンにサーバーを移設した際に挙動のズレが生じる点に留意が必要である。
日付と時刻の分離表現
Local Date
年月日のみを表現する。証明書の有効期限やサービス開始日など、時刻が不要な場合に利用する。
# 日付のみ
launch_day = 2024-10-01
expiration = 2025-12-31
Local Time
時分秒のみを表現する。毎日のアラーム設定や定期的なメンテナンス開始時刻などに適している。
# 時刻のみ
daily_alarm = 06:30:00
tea_time = 15:00 # 秒省略
型選択の指針とエラーハンドリング
適切な型を選択することで、設定ファイルの可読性とシステムの堅牢性が向上する。グローバル展開を見据えたシステムではOffset Date-Timeを優先し、特定のマシン内で完結するスケジュールであればLocal Date-TimeやLocal Timeを用いるのが基本である。
また、TOMLパーサーは不正なフォーマットをエラーとして検出する。
# 不正なフォーマット例
bad_month = 2024-13-01 # 存在しない月
bad_day = 2024-02-30 # 存在しない日
bad_hour = 25:00:00 # 存在しない時間
このようなパースエラーを防ぐため、設定ファイル内では時刻表現のスタイルを統一し、重要な日時にはインラインコメントで意図を明記することが推奨される。また、ミリ秒等の過剰な精度は不要な複雑化を招くため避けるべきである。