1. 2026-05-19 の 10 日後は 2026-05-29
  2. 2024-01-01 の 30 日後は 2024-01-31
  3. 2024-01-31 の 1 日後は 2024-02-01 (月またぎ)
  4. 2026-05-19 の 19 日前は 2026-04-30 (負の値で過去へ)
  5. 2024-02-28 の 1 日後はうるう年なので 2024-02-29
コース一覧
Java 中級:コレクション・Stream・例外処理
日付の加減算

Java 中級:コレクション・Stream・例外処理

コレクション、ジェネリクス、例外処理、Stream API、関数型インターフェース、日付処理、ファイル I/O、継承など Java の中級トピックを実践的に学べるコースです。Java の基礎文法とオブジェクト指向を理解している学習者を対象に、現場の Java コードを読み書きするための知識を補強します。約 16 時間 (1 日 30 分 × 32 日) で 64 レッスンを修了でき、修了後は Spring Boot や業務システム開発に必要な Java 力が身につきます。

1
コレクション基礎
01. ArrayList を使う5分
02. List を走査する5分
03. 要素の削除と検索5分
04. HashMap の基本5分
05. Map を走査する5分
06. Set で重複を排除5分
07. Collections クラスの便利メソッド5分
08. コレクション基礎 まとめクイズ5分
2
ジェネリクス
01. ジェネリッククラスを作る5分
02. ジェネリックメソッド5分
03. 境界型パラメータ5分
04. ワイルドカード ?5分
05. Pair<K,V> を作る5分
06. ジェネリクス まとめクイズ5分
3
例外処理
01. try-catch で例外をつかむ5分
02. 複数の catch ブロック5分
03. throws と例外の伝播5分
04. 独自の例外を作る5分
05. try-with-resources5分
06. finally ブロック5分
07. 例外処理 まとめクイズ5分
4
Stream API
01. Stream を作る5分
02. filter で絞り込む5分
03. map で変換する5分
04. reduce で集約する5分
05. collect で集める5分
06. sorted で並び替え5分
07. distinct で重複排除5分
08. limit と skip5分
09. 並列ストリーム5分
10. Stream API まとめクイズ5分
5
関数型インターフェース
01. ラムダ式の基本5分
02. メソッド参照 ::5分
03. Function インターフェース5分
04. Predicate インターフェース5分
05. Consumer と Supplier5分
06. BiFunction と 2 引数の関数5分
07. 関数型インターフェース まとめクイズ5分
6
文字列操作
01. String.format で書式化5分
02. StringBuilder で連結5分
03. 正規表現の基本5分
04. split と join5分
05. 文字列操作 まとめクイズ5分
7
日付と時刻
01. LocalDate で日付を扱う5分
02. LocalDateTime で時刻も扱う5分
03. Duration で時間差を計算5分
04. 日付の書式化とパース5分
05. 日付の加減算5分
06. 日付と時刻 まとめクイズ5分
8
ファイル I/O
01. Files でファイルに書き込む5分
02. ファイルを行単位で読む5分
03. Path でファイルパスを扱う5分
04. BufferedReader と Stream API5分
05. ファイルの存在確認と削除5分
06. ファイル I/O まとめクイズ5分
9
継承とポリモーフィズム
01. extends で継承する5分
02. super で親を呼ぶ5分
03. メソッドのオーバーライド5分
04. abstract で抽象クラス5分
05. interface で契約を定義5分
06. default メソッド5分
07. instanceof と型パターン5分
08. ポリモーフィズムを活かす5分
09. 継承とポリモーフィズム まとめクイズ5分

日付の加減算

「30 日後」を自分で数えると、月末で必ず間違える

貸出日から返却期限を出す、契約日から更新日を出す。どれも「この日から N 日後」を求めるだけの計算に見えます。ところが日にちを足して 31 を超えたら月を 1 つ進めて、その月が 30 日までなら差を調整して、2 月なら年を見てうるう年かどうかを判定して、と条件が雪だるま式に増えていきます。

LocalDate はこれを丸ごと引き受けてくれます。plusDays に日数を渡すだけです。

Java

import java.time.LocalDate; public class Demo { public static void main(String[] args) { LocalDate borrowed = LocalDate.of(2026, 1, 25); LocalDate dueDate = borrowed.plusDays(14); System.out.println(dueDate); // 2026-02-08 } }

1 月 25 日 の 14 日後が 2 月 8 日 になりました。月をまたぐ処理も、その月が何日まであるかの判定も、こちらでは書いていません。plusWeeks plusMonths plusYears も同じ形で使えます。

過去に戻したいときに、引き算を書く必要はない

戻す方向は minusDays を使うか、plusDays に負の数を渡すかのどちらでもかまいません。結果は同じです。

Java

LocalDate borrowed = LocalDate.of(2026, 1, 25); System.out.println(borrowed.minusDays(7)); // 2026-01-18 System.out.println(borrowed.plusDays(-7)); // 2026-01-18

読み手にとっては、過去なら minusDays、未来なら plusDays と書き分けるほうが分かりやすくなります。ただし、画面から +10 や -7 のような符号つきの数値がそのまま渡ってくる場合は、plusDays 1 本で受けたほうが if による場合分けを増やさずに済みます。

1 月 31 日 の 1 か月後は 2 月 31 日 にならない

日数の足し算に比べて、月の足し算には気をつけるところがあります。存在しない日付になってしまうときは、その月の末日に丸められます。

Java

System.out.println(LocalDate.of(2026, 1, 31).plusMonths(1)); // 2026-02-28 System.out.println(LocalDate.of(2024, 1, 31).plusMonths(1)); // 2024-02-29 System.out.println(LocalDate.of(2024, 2, 28).plusDays(1)); // 2024-02-29

「毎月 31 日に課金する」という仕様をそのまま plusMonths で回すと、2 月をまたいだ時点で 28 日にずれ、そこから先はずっと 28 日のままになります。丸めが起きたかどうかを気にする処理では、結果の getDayOfMonth() を確認するか、日数で動かす設計に切り替えてください。

解説

月初を求めたいだけなら withDayOfMonth(1) が使えます。plus や minus が「ずらす」のに対して、with から始まるメソッドは「その部分だけ差し替える」ものです。

やってみよう

Solution.addDays(int year, int month, int day, int n) を完成させます。

  1. ファイルの先頭に import java.time.LocalDate; を書く
  2. 受け取った年・月・日から LocalDate を作る
  3. そこから n 日ずらした日付を求め、ISO 形式の文字列にして return する

addDays(2024, 1, 31, 1) は "2024-02-01"、addDays(2026, 5, 19, -19) は "2026-04-30" です。n が負の場合も同じ 1 本の呼び出しで通るので、符号による場合分けは書かないでください。

要件

  1. ファイル先頭で import java.time.LocalDate; を書くこと
  2. LocalDate.of(year, month, day) で LocalDate を生成し、plusDays(n) で n 日後の LocalDate を求めること
  3. 求めた LocalDate の toString() の結果を return すること (yyyy-MM-dd 形式の文字列になる)

入出力例

addDays(2026, 5, 19, 10) → "2026-05-29" addDays(2024, 1, 1, 30) → "2024-01-31" addDays(2024, 1, 31, 1) → "2024-02-01" addDays(2026, 5, 19, -19) → "2026-04-30" addDays(2024, 2, 28, 1) → "2024-02-29"

ヒント

`plusDays` は負の数を渡しても正しく動くので、`n < 0` で `if` 分岐したり `minusDays` に切り替えたりする必要はありません

`LocalDate` は不変オブジェクトなので、`plusDays(n)` の戻り値を受け取らないと計算結果は失われます。必ず `return` の中で `toString()` まで繋げて呼びましょう

`return LocalDate.of(year, month, day).plusDays(n).toString();` の 1 行で完成します。月またぎやうるう年は API が自動で処理してくれます

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • 日付と時刻 まとめクイズ

    Java 8 で導入された java.time パッケージ (LocalDate / LocalDateTime / Duration / Period / DateTimeFormatter / 加減算) の総まとめ。不変性 (immutable)、ChronoUnit、parse/format の対称性など実務頻出のポイントを 4 択クイズで確認する。

  • Files でファイルに書き込む

    Java の標準ライブラリ `java.nio.file.Files` を使って、ファイルへの書き込みと読み込みをわずか数行で実現する方法を学ぼう。

  • extends で継承する

    Java の `extends` キーワードを使った継承の基本を学び、`Animal` を継承した `Dog` クラスを作って `Dog.bark()` の結果を返すコードを書いてみよう。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 処理計算や代入を表す長方形
  • 設計何をどう作るかを決める前工程
  • メソッドクラスに属する関数
main.java
学習モード
エディタを読み込んでいます

メモ

日付の加減算

⌘S で保存