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-08plusDays は新しい LocalDate を返すだけで、deadline には一切触りません。「呼んだのに変わらない」で止まる人がとても多いので、戻り値は必ず変数で受け取るか、そのまま次の処理へつなげてください。
やってみよう
Solution.formatDate(int year, int month, int day) を完成させます。
- ファイルの先頭に
import java.time.LocalDate;を書く - 受け取った 3 つの数値から
LocalDateを作る - その
LocalDateを ISO 形式の文字列にしてreturnする
formatDate(2024, 1, 1) が返すのは "2024-1-1" ではなく "2024-01-01" です。ゼロ埋めは LocalDate 側がやってくれるので、自分で桁を揃える処理は要りません。
要件
- ファイル先頭で
import java.time.LocalDate;を書くこと (java.util.Dateは使わない) LocalDate.of(year, month, day)でLocalDateインスタンスを生成すること- 生成した
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"