コース一覧
    Java中級:文字列・日付・標準ライブラリ
    LocalDate で日付を扱う

    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分

    LocalDate で日付を扱う

    日付を文字列で組み立てると、月が 1 桁のときに崩れる

    契約日や誕生日を画面に出すために、年・月・日の 3 つの数値を 2026 + "-" + 5 + "-" + 19 のようにつないだことはないでしょうか。これだと 2026-5-19 になり、2026-05-19 を前提にした並べ替えや検索と噛み合いません。ゼロ埋めのために String.format を持ち出すと、今度は「2 月 30 日は存在しない」といった暦の判定が丸ごと自分の仕事になります。

    Java には年月日そのものを表す型があります。java.time.LocalDate です。時刻もタイムゾーンも持たない、純粋な日付だけのクラスです。作り方は new ではなく、static メソッドの of に年・月・日を渡します。

    Java

    import java.time.LocalDate;
    
    public class Demo {
        public static void main(String[] args) {
            LocalDate startOfYear = LocalDate.of(2026, 1, 1);
            System.out.println(startOfYear);   // 2026-01-01
    
            LocalDate today = LocalDate.now(); // 実行した日
            System.out.println(today);
        }
    }

    月は 1 から 12 をそのまま渡します。5 と書けば 5 月です。そして LocalDate.of(2026, 2, 30) のように暦に存在しない日付を渡すと、その場で DateTimeException が飛びます。おかしな日付が黙って通り抜けないのは、文字列で組み立てていたときには得られなかった安心感です。

    ゼロ埋めを自分で書かなくていい

    LocalDate の toString() は、ゼロ埋めされた YYYY-MM-DD の文字列を返します。ISO 8601 という国際規格の書き方で、辞書順に並べればそのまま日付順になるので、ログのファイル名やキーに向いています。

    Java

    LocalDate d = LocalDate.of(2026, 1, 1);
    String fileName = "access-" + d + ".log";
    System.out.println(fileName);   // access-2026-01-01.log

    文字列連結の中で toString() が自動的に呼ばれています。String.format("%04d-%02d-%02d", ...) を書く必要はありません。

    解説

    検索すると java.util.Date や Calendar を使った古い記事が今でも出てきますが、新しく書くコードで選ぶ理由はありません。LocalDate は一度作ったら中身が変わらない不変オブジェクトなので、複数のスレッドから同時に触っても壊れないからです。

    plusDays を呼んだのに、日付が変わらない

    不変ということは、日付をずらすメソッドが元の値を書き換えないということです。

    Java

    LocalDate deadline = LocalDate.of(2026, 1, 1);
    deadline.plusDays(7);              // 戻り値を捨てている
    System.out.println(deadline);      // 2026-01-01 のまま
    
    LocalDate extended = deadline.plusDays(7);
    System.out.println(extended);      // 2026-01-08

    plusDays は新しい LocalDate を返すだけで、deadline には一切触りません。「呼んだのに変わらない」で止まる人がとても多いので、戻り値は必ず変数で受け取るか、そのまま次の処理へつなげてください。

    やってみよう

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

    1. ファイルの先頭に import java.time.LocalDate; を書く
    2. 受け取った 3 つの数値から LocalDate を作る
    3. その LocalDate を ISO 形式の文字列にして return する

    formatDate(2024, 1, 1) が返すのは "2024-1-1" ではなく "2024-01-01" です。ゼロ埋めは LocalDate 側がやってくれるので、自分で桁を揃える処理は要りません。

    要件

    1. ファイル先頭で import java.time.LocalDate; を書くこと (java.util.Date は使わない)
    2. LocalDate.of(year, month, day) で LocalDate インスタンスを生成すること
    3. 生成した LocalDate の toString() の結果 (ISO 8601 形式 YYYY-MM-DD) を return すること

    ヒント

    `LocalDate` の `toString()` は自動でゼロ埋めするので、月や日が 1 桁でも `"2024-01-01"` のように整形されます

    `LocalDate.of(2024, 1, 1)` のように、月は `1` 始まりです。`Calendar` の `0` 始まりとは違うので注意

    `return LocalDate.of(year, month, day).toString();` のようにメソッドチェーンで 1 行で書くこともできます

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

    関連レッスン

    • LocalDateTime で時刻も扱う

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

    • Duration で時間差を計算

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

    • 日付の書式化とパース

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

    • 日付の加減算

      LocalDate の plusDays や minusDays を使って日付を前後に動かす方法を学び、不変オブジェクトとしての扱い方を身につけよう。

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

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

    • クラスデータと振る舞いを束ねる単位
    • メソッドクラスに属する関数
    • オブジェクトキーと値のペアで構造を作るデータ
    • スレッド1 つの質問に紐づく返信の集まり
    • 戻り値呼び出し元への返答を表す点線矢印
    • 変数データに名前をつけて参照する仕組み
    • 処理計算や代入を表す長方形
    • インスタンスクラスから生成された実体
    main.java
    エディタを読み込んでいます

    メモ

    LocalDate で日付を扱う

    ⌘S で保存