組み込み関数

JavaScriptのDate入門|日付と時刻の操作方法

Dateオブジェクトは、JavaScriptで日付と時刻を扱うための組み込みオブジェクトです。現在の日時の取得、日付のフォーマット、日付の計算など、日時に関するあらゆる操作を行えます。実務ではフォーマットの扱いが特に重要です。

基本的な使い方

Dateオブジェクトはnew Date()で作成します。引数なしで現在の日時、引数ありで特定の日時を指定できます。

JavaScript
// 現在の日時
const now = new Date();
console.log(now);

// 文字列から日付を作成
const date1 = new Date("2025-06-15");
console.log(date1);

// 年月日時分秒を指定(月は0始まり)
const date2 = new Date(2025, 5, 15, 10, 30, 0); // 6月は5
console.log(date2);

// タイムスタンプ(ミリ秒)から作成
const date3 = new Date(1750000000000);
console.log(date3);
実行結果
2025-06-15T10:30:00.000Z(現在の日時)
2025-06-15T00:00:00.000Z
Sun Jun 15 2025 10:30:00 GMT+0900
Fri Jun 14 2025 18:26:40 GMT+0900

月の値が0始まり(1月=0、12月=11)である点は、Dateオブジェクトで最もよくあるバグの原因です。注意してください。

日付の取得とフォーマット

Dateオブジェクトから年・月・日・時・分・秒を個別に取得できます。日本語のフォーマットにはtoLocaleDateString()が便利です。

JavaScript
const date = new Date("2025-06-15T14:30:45");

// 個別に取得
console.log("年:", date.getFullYear());
console.log("月:", date.getMonth() + 1); // 0始まりなので+1
console.log("日:", date.getDate());
console.log("曜日:", date.getDay()); // 0=日, 1=月, ...6=土
console.log("時:", date.getHours());
console.log("分:", date.getMinutes());
console.log("秒:", date.getSeconds());

// フォーマット
console.log(date.toLocaleDateString("ja-JP"));
console.log(date.toLocaleString("ja-JP"));
console.log(date.toLocaleDateString("ja-JP", {
  year: "numeric", month: "long", day: "numeric", weekday: "long"
}));

// YYYY-MM-DD形式を自作
function formatDate(d) {
  const y = d.getFullYear();
  const m = String(d.getMonth() + 1).padStart(2, "0");
  const day = String(d.getDate()).padStart(2, "0");
  return `${y}-${m}-${day}`;
}
console.log(formatDate(date));
実行結果
年: 2025
月: 6
日: 15
曜日: 0
時: 14
分: 30
秒: 45
2025/6/15
2025/6/15 14:30:45
2025年6月15日日曜日
2025-06-15

日付の計算

日付の加算・減算やDiff計算は、タイムスタンプ(ミリ秒)を使って行います。

JavaScript
// 日付の加算
const today = new Date("2025-06-15");

// 7日後
const nextWeek = new Date(today);
nextWeek.setDate(today.getDate() + 7);
console.log("7日後:", formatDate(nextWeek));

// 1ヶ月後
const nextMonth = new Date(today);
nextMonth.setMonth(today.getMonth() + 1);
console.log("1ヶ月後:", formatDate(nextMonth));

// 2つの日付の差分
const start = new Date("2025-04-01");
const end = new Date("2025-06-15");
const diffMs = end - start;
const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
console.log(`差分: ${diffDays}日`);

// 年齢計算
function calcAge(birthday) {
  const today = new Date();
  const birth = new Date(birthday);
  let age = today.getFullYear() - birth.getFullYear();
  const monthDiff = today.getMonth() - birth.getMonth();
  if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birth.getDate())) {
    age--;
  }
  return age;
}
console.log("年齢:", calcAge("1995-03-20"), "歳");

function formatDate(d) {
  const y = d.getFullYear();
  const m = String(d.getMonth() + 1).padStart(2, "0");
  const day = String(d.getDate()).padStart(2, "0");
  return `${y}-${m}-${day}`;
}
実行結果
7日後: 2025-06-22
1ヶ月後: 2025-07-15
差分: 75日
年齢: 30 歳

実践的な活用例

JavaScript
// 相対時間の表示(「3分前」など)
function timeAgo(date) {
  const now = new Date();
  const diffSec = Math.floor((now - new Date(date)) / 1000);
  if (diffSec < 60) return `${diffSec}秒前`;
  if (diffSec < 3600) return `${Math.floor(diffSec / 60)}分前`;
  if (diffSec < 86400) return `${Math.floor(diffSec / 3600)}時間前`;
  return `${Math.floor(diffSec / 86400)}日前`;
}

// 営業日かどうか判定
function isBusinessDay(date) {
  const day = new Date(date).getDay();
  return day !== 0 && day !== 6; // 土日以外
}
console.log("月曜は営業日:", isBusinessDay("2025-06-16"));
console.log("土曜は営業日:", isBusinessDay("2025-06-14"));
実行結果
月曜は営業日: true
土曜は営業日: false
Temporal APIについて

Dateオブジェクトの問題点(月の0始まり、ミュータブル、タイムゾーンの扱いの難しさ)を解決するTemporal APIが策定中です。将来的にはDateの代替として使われる予定です。

注意点

月は0始まり(0=1月〜11=12月)です。new Date("2025-06-15")はUTC、new Date(2025, 5, 15)はローカルタイムで解釈されるため、同じ日付でも異なる時刻になる場合があります。日付文字列のパースは環境によって動作が異なるため、明示的に年月日を指定する方が安全です。

まとめ

  • Dateオブジェクトで日付と時刻を扱える
  • 月は0始まり(0=1月)に注意
  • toLocaleDateString()でロケールに応じたフォーマットが可能
  • 日付の差分はタイムスタンプ(ミリ秒)の引き算で計算する
  • 将来的にはTemporal APIが代替になる予定