日付計算の難しさ

日付の計算は一見シンプルに見えて、うるう年・月ごとの日数の違い・タイムゾーン・夏時間(DST)など多くの落とし穴があります。多くのプロジェクトで日付ライブラリを採用する理由はここにあります。

2つの日付の差分(日数)

// JavaScript(生のDate)
const d1 = new Date('2025-01-01')
const d2 = new Date('2025-12-31')
const diffMs = d2 - d1  // ミリ秒差
const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24))  // 364日

月末日の計算

// 月に0を指定すると前月の最終日を返す
function lastDayOfMonth(year, month) {
  return new Date(year, month, 0).getDate()
}
lastDayOfMonth(2024, 2)  // 29(2024年はうるう年)
lastDayOfMonth(2025, 2)  // 28

dayjsの活用

dayjsはMoment.jsの代替として広く使われている軽量の日付ライブラリです(2KB)。

import dayjs from 'dayjs'

dayjs('2025-01-01').add(30, 'day').format('YYYY-MM-DD')  // 2025-01-31
dayjs('2025-12-31').diff('2025-01-01', 'day')  // 364

タイムゾーンの注意点

JavaScriptのnew Date()はローカル時間を基準にするため、日本(JST)では夜0時前後に日付がずれる問題が起きやすいです。サーバーサイドではUTCで処理し、表示時にタイムゾーン変換するのがベストプラクティスです。