【プログラミングしてみよう27】JavaのDate/Time APIで日付と時刻を扱う

Java

前回はアノテーションの仕組みと使い方を学びました。

今回は「Date/Time API」について解説します。 Java 8から導入された java.time パッケージを使うことで、日付・時刻の取得・計算・フォーマットを安全かつ直感的に扱えるようになります。

Date/Time APIの基本

Java 8以前は java.util.Datejava.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と同じ仕組みで、MONDAYTUESDAY のような値になります。

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(月) ぱんまる

コメント

タイトルとURLをコピーしました