Webサイトやアプリケーションの開発において、日付の計算は避けて通れない処理の一つです。
「キャンペーン終了までの残り時間を表示したい」
「有効期限を1ヶ月延ばしたい」
など、日付を加算・減算する場面は多岐にわたります。
JavaScriptの標準機能である Date オブジェクトは、一見扱いが難しそうに感じられますが、その仕組みを正しく理解すれば、複雑な計算も数行のコードで実装可能です。
特に、初心者が不安に感じやすい「月をまたぐ計算」や「閏年(うるうどし)」についても、JavaScriptが自動で補正してくれる強力な機能を持っています。
この記事では、JavaScriptを使った日付加算の基本テクニックから、実務で頻出する文字列の日付操作、そして比較やフォーマットのベストプラクティスまでを詳しく解説します。
![]() 執筆者:マヒロ |
|
- OS:Windows 11 / macOS Sequoia
- IDE:Visual Studio / VS Code / IntelliJ IDEA
- その他:Chrome DevTools / 各言語最新安定版
※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。
JavaScriptにおける日付加算の基本
JavaScriptで日付を操作する際、最も信頼性が高く標準的な方法は Date オブジェクトのメソッドを組み合わせることです。
基本的な日数の加算方法と、多くの開発者がつまずきやすい「月またぎ」の自動調整機能について見ていきましょう。
日数を加算する方法(月またぎ・年またぎも自動対応)
特定の日付に数日を足したい場合、getDate() で現在の日を取得し、そこに数値を加えたものを setDate() で設定し直すのが定石です。
// 1. 現在の日付を取得
const dt = new Date('2025-01-25');
// 2. 10日後を加算する
dt.setDate(dt.getDate() + 10);
// 3. 結果を表示
console.log("計算後の日付:", dt.toLocaleDateString());
実行結果
計算後の日付: 2025/2/4
このソースコードが何を意味しているのかを詳しく紐解いていきます。
まず、new Date('2025-01-25') で特定の基準日を作成しました。
次に dt.getDate() を呼び出すことで、その日付の「日(この場合は25)」を取得しています。
ここで非常に重要なのが dt.setDate(25 + 10) という処理です。
単純計算では「35日」となり、1月には存在しない日付になりますが、JavaScriptの Date オブジェクトは存在しない日付が設定された場合、自動的に翌月や翌年へと繰り越してくれるという非常に優れた性質を持っています。
実行結果を見れば分かる通り、1月35日ではなく、正しく「2月4日」へと月またぎの調整が行われています。
同様に、12月末に加算を行えば自動的に年またぎの処理も行われるため、開発者が「今月は何日まであるか」といった複雑なロジックを自作する必要は一切ありません。
月や年を単位として加算する方法
日数だけでなく、「3ヶ月後」や「2年後」といった単位での加算も同様の考え方で実装可能です。
それぞれの単位に対応したメソッドを使い分けることで、直感的なコードを記述できます。
月の加算と注意すべき挙動
月単位の加算には setMonth() と getMonth() を使用します。
const dt = new Date('2025-05-31');
// 1ヶ月後を加算
dt.setMonth(dt.getMonth() + 1);
console.log("1ヶ月後の日付:", dt.toLocaleDateString());
実行結果
1ヶ月後の日付: 2025/7/1
この処理の流れについて解説を行います。
getMonth() は0から始まる数値(1月は0、5月は4)を返します。
そこに + 1 をすることで、内部的には「6月」を指定したことになります。
ただし、ここで注目したいのは元の「31日」という設定です。
6月には31日が存在しないため、JavaScriptはこれをさらに1日分繰り越し、「7月1日」として着地させます。
「翌月の末日」を期待している場合には意図しない挙動になる可能性がありますが、日付計算の厳密なルールとしてはこの自動補正が標準の動きとなります。
もし月末に合わせるような特殊な要件がある場合は、別途「翌月の0日(=今月の末日)」を指定するような工夫が必要になります。
年の加算を行う方法
年を跨ぐ計算も、setFullYear() メソッドを使うことで極めて簡単に実装できます。
const dt = new Date('2024-02-29'); // 閏年
// 1年後を加算
dt.setFullYear(dt.getFullYear() + 1);
console.log("1年後の日付:", dt.toLocaleDateString());
実行結果
1年後の日付: 2025/3/1
2024年は閏年であるため、「2月29日」という日付が存在します。
しかし、その1年後の2025年には29日はありません。
このコードを実行すると、JavaScriptは「2025年2月29日」が存在しないことを検知し、自動的に1日分進めた「2025年3月1日」を返します。
このように、カレンダーの整合性を維持しながら正確に年またぎの計算を行ってくれるため、非常に堅牢なシステムを構築することが可能です。
文字列の日付を加算して「yyyy-MM-dd」形式で取得する
実務において最も多いニーズは、「APIやDBから取得した文字列の日付を加算し、再び文字列として利用する」という流れでしょう。
標準の Date オブジェクトにはフォーマット機能が乏しいため、テンプレートリテラルなどを使って整形する必要があります。
文字列からの変換とカスタムフォーマットの実装
const dateString = "2025-10-20";
// 文字列からDateオブジェクトを作成
const targetDate = new Date(dateString);
// 1週間(7日)加算
targetDate.setDate(targetDate.getDate() + 7);
// yyyy-MM-dd 形式に整形する関数的な処理
const yyyy = targetDate.getFullYear();
const mm = String(targetDate.getMonth() + 1).padStart(2, '0');
const dd = String(targetDate.getDate()).padStart(2, '0');
const formattedDate = `${yyyy}-${mm}-${dd}`;
console.log("元の文字列:", dateString);
console.log("加算後の文字列:", formattedDate);
実行結果
元の文字列: 2025-10-20
加算後の文字列: 2025-10-27
まず、ハイフン区切りの日付文字列を new Date() に渡すことで、JavaScriptが扱える日付オブジェクトに変換しています。
加算処理が終わった後、そのまま出力すると長い詳細な文字列になってしまうため、個別に年・月・日を抽出しています。
ここで使われている padStart(2, '0') は、1桁の数字(例:5)を「05」のように2桁に揃えるためのメソッドです。
月や日が1桁の場合でも、常に「yyyy-MM-dd」の美しいフォーマットを維持することができます。
このようにして、システムが要求する特定の文字列形式に変換し直すことで、後続のDB登録や画面表示がスムーズに行えるようになります。
ミリ秒単位で細かい時間を加算する方法
より精密な時間計算が必要な場合や、短時間のタイマー処理を行いたい場合は、日付を一度「ミリ秒」に変換して計算を行う手法が有効です。
タイムスタンプを利用した計算ロジック
const dt = new Date();
console.log("現在時刻:", dt.toLocaleTimeString());
// 30分(30分 * 60秒 * 1000ミリ秒)をミリ秒で加算
const additionMillis = 30 * 60 * 1000;
const newTimeMillis = dt.getTime() + additionMillis;
// ミリ秒から新しいDateオブジェクトを再構成
const newDt = new Date(newTimeMillis);
console.log("30分後の時刻:", newDt.toLocaleTimeString());
getTime() メソッドは、1970年1月1日からの経過ミリ秒数(タイムスタンプ)を返します。
大きな数値になりますが、単なる数値計算として扱えるため、秒単位や分単位での加算・減算が非常に正確に行えます。
加算後の数値を再び new Date() に渡せば、即座に日付オブジェクトとして復元できるため、時間の比較や差分計算においてもこの手法が広く活用されています。
日付の比較と差分の計算
日付を加算した結果、ある期限を過ぎているかどうかを判定したり、2つの日付の間に何日の差があるかを知りたい場合も多いでしょう。
日付同士の比較と日数の算出
const today = new Date();
const deadline = new Date();
deadline.setDate(today.getDate() + 14); // 2週間後を期限に設定
// 日付の比較
if (deadline > today) {
console.log("まだ期限内です。");
}
// 差分の計算(ミリ秒の差を日にちに変換)
const diffMillis = deadline - today;
const diffDays = Math.floor(diffMillis / (1000 * 60 * 60 * 24));
console.log("残り日数:", diffDays, "日");
JavaScriptでは Date オブジェクト同士を比較演算子(> や <)で直接比較することが可能です。
これは比較の際に内部で自動的にタイムスタンプ数値に変換されるためです。
また、日付同士を引き算すると「ミリ秒単位の差分」が得られます。
この差分を「1日のミリ秒数(24時間 × 60分 × 60秒 × 1000ミリ秒)」で割ることで、何日間の開きがあるかを整数として算出できます。
JavaScriptのスキルを活かして年収を上げる方法
以上、JavaScriptで日付を加算する方法について詳しく解説してきました。
| 年収アップにこだわりたい方 (平均アップ額138万円の実績) | テックゴー |
| 未経験・経験者問わず幅広く探したい方 | ユニゾンキャリア |
| 業界に精通した担当者に相談したい方 | キッカケエージェント |
| ゲーム業界への転職を志望する方 | ファミキャリ |
| エンジニア未経験からキャリアを築く方 | イーチキャリア |


