よくある日付パースの落とし穴と回避方法

一般的な日付パースのバグを回避:タイムゾーンの仮定、月-日の曖昧さ、夏時間のギャップ、2桁年のカットオフ、ブラウザの不整合。

Concepts

詳細な説明

日付パースの落とし穴

日付パースはソフトウェア開発で最もエラーが発生しやすい分野の一つです。よくある落とし穴とその回避方法を紹介します。

1. タイムゾーン仮定の罠

// 危険:一部のブラウザではUTC、他ではローカルとしてパースされる
new Date("2026-02-28");

// 安全:明示的なタイムゾーン
new Date("2026-02-28T00:00:00Z");     // UTC
new Date("2026-02-28T00:00:00+09:00"); // JST

2. 月-日の曖昧さ

"01/02/2026" — これは1月2日?それとも2月1日?

ロケールを知らなければ、この日付は曖昧です。データ交換には常にISO 8601フォーマットを使用してください。

3. 夏時間のギャップ

DST遷移は存在しない時刻(春の前進)と重複する時刻(秋の後退)を作り出します。

4. 月のインデックス

// JavaScriptの月は0インデックス!
new Date(2026, 1, 28);  // 2月28日(1月28日ではない)
new Date(2026, 0, 28);  // 1月28日

5. 閏年のエッジケース

2月29日は閏年にのみ存在。
2024 — 閏年
2026 — 閏年ではない
2100 — 閏年ではない(100で割り切れるが400では割り切れない)
2000 — 閏年(400で割り切れる)

防止チェックリスト

  • パース時には常にタイムゾーンを指定
  • データ交換にはISO 8601を使用
  • データにロケール依存の月名を使わない
  • エッジケースをテスト:閏年、DST遷移、年境界
  • 手動の文字列分割よりパースライブラリを優先

ユースケース

日付パースの落とし穴を理解することで、データ移行スクリプト、異なる日付フォーマットを使用するシステム間のAPI統合、データベースのインポート/エクスポート操作、タイムゾーンをまたぐログファイル分析、DST遷移を正しく処理する必要のあるスケジューリングシステムのバグを防止できます。

試してみる — Date Format Reference & Tester

フルツールを開く