【2026年7月最新】JavaScriptの日付取得・比較・フォーマット完全ガイド|Date()の使い方からClaude Code活用まで
この記事の内容
JavaScriptの日付操作は「簡単なようで落とし穴が多い」領域です。「月は0始まり」「タイムゾーンの扱い」「文字列を==で比較してしまう」など、経験者でもハマるバグが多いです。
この記事ではDate()の基本的な使い方・日付の比較・日付差の計算・フォーマット変換・よくあるバグパターンを実際のコード例付きで解説します。後半ではClaude Codeを使った日付処理バグのデバッグ効率化も紹介します。
01 DATE BASICS JavaScriptのDateオブジェクト基本:現在日時の取得と主要メソッド new Date()から始まる日付操作の基礎
JavaScriptで日付・時刻を扱うにはDateオブジェクトを使います。まず基本的な使い方と主要なメソッドを整理します。
javascript
// 現在日時を取得
const now = new Date();
console.log(now); // Wed Jul 17 2026 10:30:00 GMT+0900 (JST)
// 特定の日時を指定して生成
const specific = new Date(2026, 6, 17); // 2026年7月17日(月は0始まり!)
const fromString = new Date('2026-07-17'); // ISO形式の文字列から
const fromTimestamp = new Date(1752710400000); // ミリ秒タイムスタンプから
// 年・月・日・時刻を個別に取得
const year = now.getFullYear(); // 2026
const month = now.getMonth() + 1; // 7(0始まりなので+1が必要!)
const day = now.getDate(); // 17
const hour = now.getHours(); // 10
const minute = now.getMinutes(); // 30
const second = now.getSeconds(); // 0
| メソッド | 戻り値の例 | 注意点 |
|---|---|---|
| getFullYear() | 2026 | getYear()は非推奨。必ずgetFullYear()を使う |
| getMonth() | 6(7月の場合) | 0〜11の値。表示時は必ず+1する |
| getDate() | 17 | 「日」を返す。getDay()とは別物(getDay()は曜日) |
| getDay() | 4(木曜日) | 0=日曜〜6=土曜。曜日を数値で返す |
| getHours() | 10 | 0〜23の24時間表記 |
| getTime() | 1752710400000 | Unix時刻(1970/1/1からのミリ秒)。日付比較に使う |
| toISOString() | 2026-07-17T01:30:00.000Z | UTC基準のISO 8601形式。APIに渡す際に便利 |
| toLocaleDateString() | 2026/7/17(日本環境の場合) | ロケール依存。環境によって表示が変わる |
📚 用語解説
Unix時刻(Unixタイムスタンプ):1970年1月1日00:00:00 UTC(Coordinated Universal Time)からの経過ミリ秒数。Date.getTime()が返す値がこれにあたる。「2026-07-17T00:00:00Z」は数値で言うと約1752710400000ミリ秒。数値なので大小比較(>・<・===)が正確に機能するため、日付比較にはこの値を使うのが最も安全。
JavaScriptのgetMonth()は「0=1月、6=7月、11=12月」を返します。「7月17日」の月を取得したい場合、getMonth()の戻り値は「7」ではなく「6」です。表示する際は必ず+1してください。なお、new Date(年, 月, 日)でDateを生成する時も月は0始まりです。「new Date(2026, 7, 17)」は「7月17日」ではなく「8月17日」になります。
02 DATE COMPARISON 日付の比較方法:getTime()・比較演算子の使い方 「文字列比較」vs「ミリ秒比較」の使い分け
JavaScriptでの日付比較にはいくつかの方法があります。それぞれの動作と使い分けを解説します。
javascript
const date1 = new Date('2026-03-01');
const date2 = new Date('2026-11-15');
// 方法1: 比較演算子(< > は使える)
console.log(date1 < date2); // true(date1が過去)
console.log(date1 > date2); // false
// 方法2: getTime()でms変換してから比較(最も確実)
console.log(date1.getTime() < date2.getTime()); // true
console.log(date1.getTime() === date2.getTime()); // false
// 注意: == や === はオブジェクト参照比較になるため使えない
const d1 = new Date('2026-07-17');
const d2 = new Date('2026-07-17');
console.log(d1 == d2); // false(同じ日付でも別オブジェクト)
console.log(d1.getTime() === d2.getTime()); // true(正しい比較)
重要な注意点:Dateオブジェクト同士を「==」や「===」で比較してはいけません。同じ日付を表すDateオブジェクトでも、異なるオブジェクトとして生成された場合は「==」で比較すると必ずfalseになります。日付の等価比較は必ずgetTime()を使って数値(ミリ秒)に変換してから比較します。
📚 用語解説
参照比較 vs 値比較:JavaScriptでオブジェクト(Date・Array・Object等)を==や===で比較すると、「同じオブジェクトを指しているか(参照比較)」が行われる。「同じ内容か(値比較)」ではない。そのため同じ日付を表す2つのDateオブジェクトを==で比較するとfalseになる。プリミティブ型(数値・文字列・真偽値)は値比較が行われるため、getTime()で数値に変換してから===比較することで正確な日付の等価判定ができる。
| 比較方法 | コード例 | 使えるか | 説明 |
|---|---|---|---|
| < > で大小比較 | date1 < date2 | OK | 日付の前後関係の比較に使える |
| == で等価比較 | date1 == date2 | NG | オブジェクト参照比較のため同じ日付でもfalse |
| === で厳密等価 | date1 === date2 | NG | == と同じ問題で使えない |
| getTime()変換後 === | date1.getTime() === date2.getTime() | OK | 最も確実。数値比較になるため正確 |
| valueOf()変換後 === | date1.valueOf() === date2.valueOf() | OK | getTime()と同等(valueOf()はgetTime()を呼ぶ) |
| 文字列変換後 === | date1.toISOString() === date2.toISOString() | 条件付きOK | 両者が同じUTCタイムゾーンなら使えるが不安定 |
03 DATE DIFF 日付差の計算:日数・時間・分のミリ秒計算 2つの日付の差を「日数」「時間」「分」に変換する計算式
2つの日付の差(日数・時間・分)を計算するには、両者をgetTime()でミリ秒に変換してから引き算し、必要な単位(日・時間・分)に換算します。
javascript
const date1 = new Date('2026-01-01');
const date2 = new Date('2026-07-17');
// ミリ秒の差を計算
const diffMs = date2.getTime() - date1.getTime();
// diffMs = 197 * 24 * 60 * 60 * 1000 = 17020800000
// 日数に変換
const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
console.log(diffDays); // 197(日)
// 時間に変換
const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
console.log(diffHours); // 4728(時間)
// 分に変換
const diffMinutes = Math.floor(diffMs / (1000 * 60));
console.log(diffMinutes); // 283680(分)
// 「何日何時間何分」の表示
const days = Math.floor(diffMs / (1000 * 60 * 60 * 24));
const hours = Math.floor((diffMs % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
const minutes = Math.floor((diffMs % (1000 * 60 * 60)) / (1000 * 60));
console.log(`${days}日${hours}時間${minutes}分`); // 197日0時間0分
ミリ秒換算の覚え方:1秒=1,000ms → 1分=60,000ms → 1時間=3,600,000ms → 1日=86,400,000ms。日付差を日数に変換する際は「diffMs ÷ 86,400,000」で計算できます。
日本(JST)は夏時間がないためこの問題は少ないですが、アメリカ・ヨーロッパなどのサマータイムがある地域では1日の長さが23時間または25時間になる日があります。Dateオブジェクトはタイムゾーンを考慮した実際の時刻を扱うため、サマータイムをまたぐ日付差の計算では誤差が生じることがあります。グローバルアプリケーションではdayjsやdate-fnsなどのライブラリの使用を検討してください。
📚 用語解説
ミリ秒(Millisecond):1秒の1,000分の1。コンピュータの時刻計算では「1970年1月1日0時0分0秒(UTC)からのミリ秒数」(Unixタイムスタンプ)が標準的に使われる。JavaScriptのDate.getTime()もミリ秒を返す。ミリ秒で扱うことで、日付・時刻を整数(Int64)として精確に比較・計算できる。
04 DATE FORMAT 日付のフォーマット:YYYY-MM-DD・日本語形式に変換 標準メソッドで対応できない書式変換の実装方法
JavaScriptにはPHPのdate()関数のような汎用フォーマット関数が標準装備されていません。「YYYY-MM-DD」「YYYY年MM月DD日」などの形式に変換するには、getFullYear()・getMonth()・getDate()を組み合わせて自前で実装します。
javascript
const now = new Date();
// YYYY-MM-DD形式(ゼロ埋め付き)
function formatDate(date) {
const y = date.getFullYear();
const m = String(date.getMonth() + 1).padStart(2, '0'); // 2桁ゼロ埋め
const d = String(date.getDate()).padStart(2, '0');
return `${y}-${m}-${d}`;
}
console.log(formatDate(now)); // 2026-07-17
// 日本語形式
function formatDateJP(date) {
return `${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日`;
}
console.log(formatDateJP(now)); // 2026年7月17日
// ISO 8601形式(UTCタイムゾーン)
console.log(now.toISOString()); // 2026-07-17T01:30:00.000Z
// Intl.DateTimeFormat(ロケール対応)
const jpFormatter = new Intl.DateTimeFormat('ja-JP', {
year: 'numeric', month: 'long', day: 'numeric', weekday: 'long'
});
console.log(jpFormatter.format(now)); // 2026年7月17日木曜日
「07」「03」のように2桁固定で表示したい場合、String(value).padStart(2, "0") が便利です。「getMonth() + 1」の結果が1桁の場合も2桁にそろえてくれます。例: String(7).padStart(2, "0") → "07"。
日付フォーマットのライブラリ比較:標準 vs day.js vs date-fns
日付フォーマットが複雑になる場合はライブラリを使うのが現実的です。主要な選択肢を比較します。
| 選択肢 | バンドルサイズ | 書き方の例 | 向いているケース |
|---|---|---|---|
| 標準Date API | 0KB(組み込み) | padStart等で自前実装 | 簡単な表示・プロジェクトが軽量重視 |
| day.js | 約2KB | dayjs().format("YYYY-MM-DD") | 最も人気。Moment.jsからの乗り換えが多い |
| date-fns | 必要な関数だけ(ツリーシェイク対応) | format(date, "yyyy-MM-dd") | 関数型スタイル・TypeScript対応が重要な場合 |
| Temporal API(将来) | 組み込み(提案中) | Temporal.PlainDate.from("2026-07-17") | ブラウザ標準化後の次世代標準(現時点はpolyfill必要) |
小規模なプロジェクトや「フォーマットが数パターンしかない」場合は標準DateAPIで十分です。ただし日付操作が頻繁に必要・タイムゾーン操作が必要・チームで一貫したAPIを使いたい場合はday.jsの導入を強くお勧めします。
現代のブラウザ・Node.jsではIntl.DateTimeFormatによる国際化対応のフォーマットも利用できます。ただし、プロジェクトで日付操作が頻繁に必要な場合はday.js(軽量・人気)やdate-fns(関数型・ツリーシェイク対応)などのライブラリの導入も検討してください。標準APIより簡潔なコードで複雑な日付操作ができます。
05 COMMON BUGS よくあるバグと落とし穴:月は0始まり・タイムゾーン問題 実務でよく遭遇する日付バグのパターンと対処法
| バグパターン | 症状 | 原因 | 解決策 |
|---|---|---|---|
| 月が1ずれる | 7月のつもりが8月と表示される | new Date(2026, 7, 1)の月は0始まりで「8月」 | new Date(2026, 6, 1)に修正(7月=6) |
| 日付比較でtrueにならない | 同じ日付なのに==がfalse | Dateオブジェクトは参照比較 | getTime()===getTime()で比較 |
| 文字列の日付比較でバグ | "2024-3-1" > "2024-11-15"がtrueになる | ゼロ埋めなしの文字列比較は文字コード順 | new Date()でパースしてgetTime()比較 |
| UTC vs JST時刻ズレ | new Date("2026-07-17")が7月16日になる | ISO文字列はUTCとして解釈される | "2026-07-17T00:00:00+09:00"と明示する |
| うるう年の計算ミス | 2月29日の翌日が3月2日になる | 手動で日数計算するとうるう年を考慮しない | setDate()を使って計算する |
| midnight直前の日付ズレ | 23:59:59に取得した日付が翌日になる | タイムゾーン変換後に日をまたぐ | toLocaleDateString()かタイムゾーン指定を使う |
javascript
// バグ例1: 月は0始まりのミス
const wrong = new Date(2026, 7, 1); // 8月1日になってしまう!
const correct = new Date(2026, 6, 1); // 7月1日(正しい)
// バグ例2: ISO文字列のタイムゾーン問題
const d1 = new Date("2026-07-17"); // UTC午前0時として解釈 → JSTでは前日の23:00
const d2 = new Date("2026-07-17T00:00:00+09:00"); // JST指定で正しい
// バグ例3: 文字列比較の罠
"2024-3-1" > "2024-11-15" // true(文字コードで"3" > "1"なので誤り)
new Date("2024-3-1").getTime() > new Date("2024-11-15").getTime() // false(正しい)
// 正しいうるう年対応の日付加算
const today = new Date();
today.setDate(today.getDate() + 30); // 30日後(うるう年も自動対応)
06 PRACTICAL PATTERNS 実用的なDate活用パターン:昨日・明日・N日後の計算 よく使う日付操作の定番コードをまとめて解説
javascript
const today = new Date();
// 昨日
const yesterday = new Date(today);
yesterday.setDate(today.getDate() - 1);
// 明日
const tomorrow = new Date(today);
tomorrow.setDate(today.getDate() + 1);
// N日後
function addDays(date, n) {
const result = new Date(date);
result.setDate(date.getDate() + n);
return result;
}
const after30days = addDays(today, 30);
const before7days = addDays(today, -7);
// 月初・月末
const firstDayOfMonth = new Date(today.getFullYear(), today.getMonth(), 1);
const lastDayOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0);
// getMonth() + 1(翌月)の「0日目」= 今月の末日
// 今年の残り日数
const endOfYear = new Date(today.getFullYear(), 11, 31); // 12月31日(月は0始まり)
const remainingDays = Math.ceil(
(endOfYear.getTime() - today.getTime()) / (1000 * 60 * 60 * 24)
);
// 曜日を日本語で取得
const weekdays = ["日", "月", "火", "水", "木", "金", "土"];
const weekday = weekdays[today.getDay()];
console.log(`本日は${weekday}曜日`);
特に「月末日の取得」はnew Date(年, 翌月, 0)のday=0トリックが便利です。「0日目」は自動的に前月の末日を指すため、2月28日(うるう年なら29日)も自動で正しく返されます。手動でうるう年を判定する必要がないため、このパターンを覚えておくと実用的です。
setDate(today.getDate() + 30)のように月をまたぐ日数を加算しても、JavaScriptが自動的に翌月・翌年の正しい日付に変換してくれます。「1月31日 + 1日」はsetDate(32)になりますが、自動的に2月1日として処理されます。
📚 用語解説
うるう年(閏年 / Leap Year):2月が29日になる年。グレゴリオ暦では「4で割り切れる年はうるう年。ただし100で割り切れる年は平年。ただし400で割り切れる年はうるう年」というルールで決まる。2024年・2028年はうるう年、2100年・2200年・2300年は平年(400で割り切れないため)。JavaScriptのsetDate()やnew Date(年, 月, 日)はうるう年を自動考慮するが、手動で日付計算する場合はうるう年判定ロジックが必要。
new Date()
現在日時
getFullYear()等
年月日時分秒
getTime()→数値
差・大小比較
setDate()
N日後・前
padStart()等
表示形式変換
07 CLAUDE CODE Claude Codeで日付処理バグをデバッグする方法 日付バグは原因が見つけにくい—Claude Codeで素早く特定する
日付処理のバグは「表示上は正常に見えて動作が間違っている」ことが多く、原因の特定が難しいです。Claude Codeを使うと、日付バグの原因特定・修正・テストコード生成を効率化できます。
| 活用シーン | Claude Codeへの質問例 | 期待される効果 |
|---|---|---|
| バグ特定 | "この日付比較コードで期待した結果にならない原因を教えて(コード貼り付け)" | タイムゾーン・0始まり月・参照比較の問題を指摘 |
| 正しいコードへの修正 | "getTime()を使った安全な日付比較に書き直して" | 修正済みコードを即座に生成 |
| エッジケースのテスト | "この日付計算関数で境界値テストケースを書いて" | うるう年・月末・年末など境界条件のテストを生成 |
| ライブラリ選定 | "day.jsとdate-fnsの比較を教えて。バンドルサイズと機能で比較" | 用途別のライブラリ選定アドバイス |
| フォーマット変換 | "この日付文字列をYYYY/MM/DD(曜日)形式に変換する関数を書いて" | 指定フォーマットのコードを生成 |
特に効果的なのが「エッジケースのテストコード生成」です。日付処理は「1月31日の翌月」「2月29日(うるう年)」「年末年始をまたぐ計算」など境界条件でバグが多い。Claude Codeに「この関数のエッジケースを列挙して、それぞれのテストコードを書いて」と依頼すると、見落としがちな境界条件を網羅したテストを自動生成できます。
📚 用語解説
ISO 8601:日付・時刻の国際標準表記形式。「YYYY-MM-DDTHH:mm:ss.sssZ」の形式で表現される。末尾のZはUTC(協定世界時)を意味し、+09:00のようなオフセットで他のタイムゾーンも表現できる。JavaScriptのDate.toISOString()はISO 8601形式の文字列を返す。APIのリクエスト・レスポンスでは基本的にこの形式を使うことで、タイムゾーンの誤解が生じにくくなる。
複雑な日付操作(繰り返し予定の計算・タイムゾーン変換・国際化表示など)が必要な場合は、バンドルサイズが約2KBのday.jsか、ツリーシェイク対応のdate-fnsを使うことをお勧めします。標準のDateオブジェクトより遥かに少ないコードで複雑な処理が書けます。
JavaScriptを活用した業務自動化・AI連携の相談はGENAIへ
Claude Codeを使ったJavaScript業務スクリプト作成・自動化システムの設計から実装まで。AI鬼管理でサポートします。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
AI活用を自社で回せるようになりたい方へ
AI鬼管理
Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。
よくある質問
Q. JavaScriptで現在の日付を「2026-07-17」形式で取得するには?
A. 標準的な書き方は以下です:const now = new Date(); const formatted = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}` ;。getMonth()は0始まりなので必ず+1する点に注意してください。より簡潔に書くなら now.toISOString().split("T")[0] でもUTC基準のYYYY-MM-DD形式を取得できます(ただしJST環境では午前9時より前の時刻で日付がずれる可能性があります)。
Q. 2つの日付の差を日数で取得するには?
A. Math.floor((date2.getTime() - date1.getTime()) / (1000 * 60 * 60 * 24)) で計算できます。ポイントは両者をgetTime()でミリ秒に変換してから引き算し、1日のミリ秒数(86,400,000)で割ること。Math.floor()で整数に切り捨てることで「完全な1日が何日分か」を計算できます。
Q. JavaScriptで月末日を取得するには?
A. new Date(year, month + 1, 0).getDate() で取得できます。「翌月の0日目」は前月(=今月)の末日を返すJavaScriptの仕組みを活用したトリックです。例えば7月末日ならnew Date(2026, 7, 0).getDate() → 31。2月末日(うるう年対応)もnew Date(2026, 2, 0).getDate()で正しく28日または29日を返します。
Q. 日付をgetTime()で比較するとどういう利点がありますか?
A. getTime()はDateオブジェクトをミリ秒の整数値に変換するため、数値の大小比較(<、>、===)が使えます。Dateオブジェクトをそのまま==や===で比較するとオブジェクト参照の比較になるため、同じ日付でも別々のオブジェクトとして生成した場合はfalseになります。getTime()でミリ秒変換すれば===で正確な等価判定ができます。
Q. new Date("2026-07-17")がなぜ前の日になってしまうのですか?
A. ISO形式の文字列("2026-07-17")はUTC(協定世界時)として解釈されます。JSTはUTC+9時間のため、"2026-07-17"はJSTでは「2026-07-16 09:00:00(前日の午後9時)」となります。日本時間で指定するには"2026-07-17T00:00:00+09:00"とタイムゾーンを明示してください。
Q. Claude Codeで日付のバグを解消する効果的な質問方法は?
A. バグのあるコードと期待する動作・実際の動作を明示して質問するのが効果的です。例:「以下のコードで、2026-07-17を渡すと2026-07-16と返ってきます。原因と修正方法を教えてください。(コードを貼り付け)」というように、入力・期待値・実際の結果をセットで伝えると、Claude Codeが原因を正確に特定して修正案を提示してくれます。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
Claude Code を業務に落とし込む
専門研修コース一覧
受講者本人の業務を題材に、「使いこなせる」状態になるまで伴走する研修プログラム。1対1特化型・ハンズオン・法人講座の3コースを展開中。業務特化・実装まで踏み込むタイプのClaude Code研修です。
研修コース一覧を見る →AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。





