前回はアノテーションの仕組みと使い方を学びました。
今回は「Date/Time API」について解説します。 Java 8から導入された java.time パッケージを使うことで、日付・時刻の取得・計算・フォーマットを安全かつ直感的に扱えるようになります。
Date/Time APIの基本
Java 8以前は java.util.Date や java.util.Calendar を使って日付を扱っていましたが、使いにくく、バグを生みやすいという問題がありました。Java 8からは java.time パッケージが導入され、より直感的に日付・時刻を扱えるようになりました。
よく使うクラスは以下の通りです。
LocalDate // 日付のみ(年・月・日)
LocalTime // 時刻のみ(時・分・秒)
LocalDateTime // 日付と時刻の両方
DateTimeFormatter // 日付・時刻のフォーマット
これらのクラスはすべてイミュータブルで、前回学んだイミュータブルクラスと同じく、値を変えるメソッドは常に新しいインスタンスを返します。
サンプルコード(日付と時刻の基本操作)
ファイル作成
「Java16」フォルダに DateTimeTest.java という名前でファイルを作成します

コード入力
以下のコードを入力します。
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.DayOfWeek;
public class DateTimeTest {
public static void main(String[] args) {
// 現在の日付・時刻を取得
LocalDate today = LocalDate.now();
LocalTime now = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
System.out.println("今日の日付: " + today);
System.out.println("現在の時刻: " + now);
System.out.println("現在の日時: " + dateTime);
// 特定の日付を作成
LocalDate birthday = LocalDate.of(2000, 1, 15);
System.out.println("\n誕生日: " + birthday);
System.out.println("年: " + birthday.getYear());
System.out.println("月: " + birthday.getMonthValue());
System.out.println("日: " + birthday.getDayOfMonth());
// 曜日を取得
DayOfWeek dayOfWeek = today.getDayOfWeek();
System.out.println("\n今日の曜日: " + dayOfWeek);
// 日付の比較
LocalDate newYear = LocalDate.of(2026, 1, 1);
System.out.println("\n今日は元日より後?: " + today.isAfter(newYear));
System.out.println("今日は元日より前?: " + today.isBefore(newYear));
}
}

コンパイル
javac DateTimeTest.java

実行
java DateTimeTest
実行結果は次のようになります(実行日時によって異なります)。
今日の日付: 2026-07-06
現在の時刻: 08:36:50.702552
現在の日時: 2026-07-06T08:36:50.702571
誕生日: 2000-01-15
年: 2000
月: 1
日: 15
今日の曜日: MONDAY
今日は元日より後?: true
今日は元日より前?: false

サンプルコード(日付の計算とフォーマット)
ファイル作成
「Java16」フォルダに DateCalcTest.java という名前でファイルを作成します

コード入力
以下のコードを入力します。
import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
public class DateCalcTest {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(2000, 1, 15);
// 日付の加算・減算
LocalDate nextWeek = today.plusDays(7);
LocalDate lastMonth = today.minusMonths(1);
LocalDate nextYear = today.plusYears(1);
System.out.println("今日: " + today);
System.out.println("1週間後: " + nextWeek);
System.out.println("1ヶ月前: " + lastMonth);
System.out.println("1年後: " + nextYear);
// 2つの日付の差を計算
Period period = Period.between(birthday, today);
System.out.println("\n誕生日からの経過:");
System.out.println(period.getYears() + "年 " + period.getMonths() + "ヶ月 " + period.getDays() + "日");
// 日付のフォーマット
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
String formatted = today.format(formatter);
System.out.println("\nフォーマット後: " + formatted);
// 文字列から日付に変換
String dateStr = "2026-12-25";
LocalDate christmas = LocalDate.parse(dateStr);
System.out.println("クリスマス: " + christmas.format(formatter));
}
}

コンパイル
javac DateCalcTest.java

実行
java DateCalcTest
実行結果は次のようになります(実行日によって異なります)。
今日: 2026-07-06
1週間後: 2026-07-13
1ヶ月前: 2026-06-06
1年後: 2027-07-06
誕生日からの経過:
26年 5ヶ月 21日
フォーマット後: 2026年07月06日
クリスマス: 2026年12月25日

コードの解説
LocalDate.now() で今日の日付、LocalTime.now() で現在の時刻、LocalDateTime.now() で日時の両方を取得できます。LocalDate.of(2000, 1, 15) のように、年・月・日を直接指定して日付を作ることもできます。
getYear()・getMonthValue()・getDayOfMonth() で年・月・日をそれぞれ取り出せます。getDayOfWeek() は曜日を DayOfWeek 型の列挙型で返します。以前学んだenumと同じ仕組みで、MONDAY・TUESDAY のような値になります。
isAfter() と isBefore() で日付の前後を比較できます。equals() で同じ日付かどうかも確認できます。
日付の加算・減算には plusDays()・plusMonths()・plusYears() や、それぞれの minus 版を使います。前回学んだイミュータブルクラスと同様に、元の日付は変更されず、新しい LocalDate インスタンスが返ってきます。
Period.between(start, end) で2つの日付の差を計算できます。getYears()・getMonths()・getDays() で年・月・日単位の差をそれぞれ取得できます。
DateTimeFormatter.ofPattern("yyyy年MM月dd日") でフォーマットを定義し、date.format(formatter) で文字列に変換できます。逆に LocalDate.parse(dateStr) で文字列から LocalDate に変換することもできます。デフォルトのフォーマットは yyyy-MM-dd 形式です。
まとめ
java.time パッケージを使うことで、日付・時刻の取得・計算・フォーマット・変換を直感的かつ安全に扱えます。LocalDate で日付のみ、LocalTime で時刻のみ、LocalDateTime で日時の両方を扱い、DateTimeFormatter でフォーマットを制御するという組み合わせを覚えておきましょう。これらのクラスはすべてイミュータブルなので、計算メソッドは常に新しいインスタンスを返す点も重要です。日付・時刻の処理は予約管理・ログ・スケジュールなどあらゆるアプリで必要になるため、基本的な使い方をしっかり押さえておきましょう。
2026/07/06(月) ぱんまる


コメント