概要
日付処理とは、“見た目”ではなく“意味”を整える設計行為である。
JavaScriptの Date
はグローバルな仕様にしては脆弱すぎる。
だからこそ、標準APIの理解と、ライブラリの選定・運用ポリシーを含めた戦略設計が必要不可欠になる。
本稿では、日付を“壊れず・迷わず・読める形で使い続ける”ための構造設計を整理する。
1. JavaScript標準Dateの限界と強み
const d = new Date('2023-12-01T12:00:00+09:00');
✅ 利点
- ブラウザ/Node.js共通
- ISO文字列で扱いやすい
-
toISOString
,getTime()
などで精度あり
❌ 欠点
-
Date
のコンストラクタが曖昧な挙動をする(非標準文字列がパースされる) - タイムゾーンが内部ではUTC固定 → “表示用”のズレ
- 月(0始まり)、日付比較の煩雑さ
2. ライブラリ導入の判断軸
処理の内容 | 推奨手段 |
---|---|
フォーマット・差分・加減算 | ✅ date-fns
|
タイムゾーン操作が多い | ✅ Luxon or Intl API |
単純な日付表示・変換 |
Date.toLocaleDateString() で済ませる |
ビジネスロジックに関わる計算 | 自作 or date-fns で構造化 |
3. date-fnsで構造化する日付処理
import { format, parseISO, addDays, isBefore } from 'date-fns';
const d = parseISO('2023-12-01');
const label = format(d, 'yyyy年MM月dd日');
const tomorrow = addDays(d, 1);
- ✅ 関数型で1処理1関数
- ✅ 型の変化が明確、不変
- ✅ 一貫した処理構造が構築可能
4. Luxonでのタイムゾーン管理
import { DateTime } from 'luxon';
const dt = DateTime.fromISO('2023-12-01T12:00:00', { zone: 'Asia/Tokyo' });
dt.toFormat('yyyy/MM/dd HH:mm'); // "2023/12/01 12:00"
- ✅
zone
による明示的タイムゾーン指定 - ✅ ISO ⇄ ローカル ⇄ UTCの切り替えが簡潔
- ✅
toUTC()
,toLocal()
,toISO()
で表現形式を制御可能
5. 表示 vs ロジックの構造的分離
// ロジック(計算)
const isExpired = isBefore(parseISO(dueDate), new Date());
// 表示
const label = format(parseISO(dueDate), 'yyyy/MM/dd');
→ ✅ 日付そのものの“意味”と“表現”を常に別レイヤーで設計する
6. 国際化(i18n)とフォーマット戦略
const date = new Date('2024-03-31');
date.toLocaleDateString('ja-JP', {
year: 'numeric',
month: 'long',
day: 'numeric',
}); // → "2024年3月31日"
- ✅
toLocaleDateString()
で言語ローカライズ - ✅ ただし細かいレイアウト制御には不向き(→ ライブラリ使用)
7. 設計判断フロー
① 単純な表示 or ログ? → Date + toLocaleDateString()
② 表示形式が複数? → format()系関数でテンプレート化
③ 日付加算・差分? → date-fnsで構造化
④ タイムゾーン変換が必要? → Luxonなどで明示的設計
⑤ UI表示とロジックが混在? → レイヤーを明確に分離
よくあるミスと対策
❌ 月の計算で off-by-one エラー(0始まり)
→ ✅ getMonth() + 1
ではなく format(date, 'MM')
を利用
❌ UTC / ローカル変換で意図しないズレが発生
→ ✅ Date
の内部は常にUTC → 明示的に toLocaleString()
or toISOString()
を使い分け
❌ new Date()
に文字列を直接渡す
→ ✅ parseISO()
や fromFormat()
などを明示的に使う
結語
日付とは「いつか」ではなく、「どう扱うか」が本質である。
- 表示と意味を分離し
- 加減算と比較を明示的にし
- タイムゾーンを設計に組み込む
JavaScriptにおける日付処理設計とは、
“曖昧な時間”を“壊れない構造”に変換する技術戦略である。