コース一覧
    Java中級:文字列・日付・標準ライブラリ
    日付の加減算

    Java中級:文字列・日付・標準ライブラリ

    文字列・日付・時刻と標準ライブラリを学び、よく使うデータ加工や日時処理を適切に実装できるようにします。

    1
    文字列操作
    01. String.format で書式化5分
    02. StringBuilder で連結5分
    03. 正規表現の基本5分
    04. split と join5分
    05. 文字列操作 まとめクイズ5分
    2
    日付と時刻
    01. LocalDate で日付を扱う5分
    02. LocalDateTime で時刻も扱う5分
    03. Duration で時間差を計算5分
    04. 日付の書式化とパース5分
    05. 日付の加減算5分
    06. 日付と時刻 まとめクイズ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 形式の文字列になる)

    ヒント

    `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 択クイズで確認する。

    • 日付の書式化とパース

      DateTimeFormatter.ofPattern() で LocalDate を任意の書式に変換し、逆に文字列から日付へ parse する方法を学ぼう。

    • Duration で時間差を計算

      `Duration` と `Period`、`ChronoUnit.between` の違いを整理しながら、2 つの日付の差を日数で計算するメソッドを書いてみよう。

    • LocalDateTime で時刻も扱う

      前回学んだ LocalDate に時刻を加えた LocalDateTime を使い、DateTimeFormatter で日付と時刻を任意の形式に書式化する流れを身につけよう。

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

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

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

    メモ

    日付の加減算

    ⌘S で保存