1. 2026 年 5 月 19 日を ISO 形式の文字列で返す
  2. 1 桁の月日はゼロ埋めされて 2024-01-01 になる
  3. 2000 年 12 月 31 日を ISO 形式で返す
  4. 1990 年 4 月 1 日もゼロ埋めされて 1990-04-01 になる
コース一覧
Java 中級:コレクション・Stream・例外処理
LocalDate で日付を扱う

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分

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 すること

入出力例

formatDate(2026, 5, 19) → "2026-05-19" formatDate(2024, 1, 1) → "2024-01-01" formatDate(2000, 12, 31) → "2000-12-31" formatDate(1990, 4, 1) → "1990-04-01"

ヒント

`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 で保存