calc / date

日時差分計算

2つの日時の差を日・時間・分・秒・年月日で計算します。デプロイ間隔や期間計算に便利です。入力内容はサーバーに送信されません。

差分
70時間 00
7日
概算00ヶ月7
総日数
7
総時間数
168時間
総分数
10,080
総秒数
604,800

使い方

01
  1. 「開始日時」と「終了日時」に日時を入力してください
  2. 「今すぐ設定」ボタンで現在時刻を素早くセットできます
  3. 入力と同時にリアルタイムで差分が計算されます
  4. 結果は日・時間・分・秒の詳細表示と、総日数・総時間数などのまとめカードで確認できます
  5. 終了日時が開始日時より前の場合も差分は絶対値で計算されます

実装コード

02

ブラウザ標準の Date オブジェクトのみで実装。外部ライブラリ不要でそのままコピーして利用できます。

export type DiffResult = {
  totalMs: number
  days: number
  hours: number
  minutes: number
  seconds: number
  totalDays: number
  totalHours: number
  totalMinutes: number
  totalSeconds: number
  approxYears: number
  approxMonths: number
  approxDaysRemainder: number
  isPast: boolean
}

export function calcDiff(date1: string, date2: string): DiffResult | null {
  const d1 = new Date(date1)
  const d2 = new Date(date2)
  if (isNaN(d1.getTime()) || isNaN(d2.getTime())) return null

  const totalMs = Math.abs(d2.getTime() - d1.getTime())
  const totalSeconds = Math.floor(totalMs / 1000)
  const totalMinutes = Math.floor(totalMs / 60000)
  const totalHours = Math.floor(totalMs / 3600000)
  const totalDays = Math.floor(totalMs / 86400000)

  const days = totalDays
  const hours = Math.floor((totalMs % 86400000) / 3600000)
  const minutes = Math.floor((totalMs % 3600000) / 60000)
  const seconds = Math.floor((totalMs % 60000) / 1000)

  const approxYears = Math.floor(totalDays / 365)
  const approxMonths = Math.floor((totalDays % 365) / 30)
  const approxDaysRemainder = totalDays % 30

  return {
    totalMs, days, hours, minutes, seconds,
    totalDays, totalHours, totalMinutes, totalSeconds,
    approxYears, approxMonths, approxDaysRemainder,
    isPast: d1.getTime() > d2.getTime(),
  }
}

export function formatDuration(result: DiffResult): string {
  const parts: string[] = []
  if (result.approxYears > 0) parts.push(`${result.approxYears}年`)
  if (result.approxMonths > 0) parts.push(`${result.approxMonths}ヶ月`)
  if (result.approxDaysRemainder > 0 || parts.length === 0)
    parts.push(`${result.approxDaysRemainder}日`)
  const timeParts: string[] = []
  if (result.hours > 0) timeParts.push(`${result.hours}時間`)
  if (result.minutes > 0) timeParts.push(`${result.minutes}分`)
  if (timeParts.length > 0) parts.push(timeParts.join(''))
  return parts.join('')
}

よくある使用例・注意点

03
プロジェクト期間の計算
プロジェクトの開始日と終了日を入力することで、正確な開発期間を日・時間単位で把握できます。スプリント期間(14日)やリリース間隔の確認にも便利です。デプロイタイムスタンプを2つ貼り付けるだけで差分が出ます。
年齢・経過年数の計算
生年月日と現在日時を入力すると「約X年Xヶ月X日」として概算の年齢が表示されます。ただし年月の概算は365日/12ヶ月を基準にしているため、うるう年や月ごとの日数差は考慮されていません。厳密な年齢計算が必要な場合は別途暦計算ロジックを実装してください。
うるう年・月またぎへの注意
このツールの「年月日概算」はあくまで参考値です。365日を1年、30日を1ヶ月として単純割り算しています。うるう年(366日)や月によって日数が異なる(28〜31日)ため、年月単位での厳密な差分が必要な場合は差異が生じます。正確な差分が必要な場合は「総日数」や「総時間数」を使ってください。
タイムゾーンについて
datetime-local 入力はブラウザのローカルタイムゾーンで値を扱います。そのため計算結果はあなたのブラウザのタイムゾーン設定に依存します。UTCや別タイムゾーンのタイムスタンプを比較する場合は、同一タイムゾーンに変換してから入力してください。タイムゾーン変換には「タイムゾーン変換」ツールを活用できます。

関連ツール

04
UNIXタイム変換タイムゾーン変換営業日計算

ソースコード

05

このツールのソースコード(テストコードを含む)はGitHubで公開しています。 MITライセンスで自由に利用・改変できます。

GitHub でコードを見る →