2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaScriptにおける日付処理設計:標準API vs ライブラリ、国際化、フォーマット・比較・操作の一貫性

Posted at

概要

日付処理とは、“見た目”ではなく“意味”を整える設計行為である。
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における日付処理設計とは、
“曖昧な時間”を“壊れない構造”に変換する技術戦略である。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?