Javaの日時操作|java.timeパッケージ入門

先生

Java8からのjava.timeパッケージで、あの日時操作の悩みを解決!もうDateクラスに苦しむ必要はありません。

Javaの新しい日時API:java.timeパッケージとは?

Java 8から導入されたjava.timeパッケージは、従来の日時API (java.util.Date, java.util.Calendar) の問題点を解消し、より直感的で使いやすい日時操作を提供します。この記事では、java.timeパッケージの基本的な使い方から、日付、時刻、期間の操作まで、具体的なコード例を交えながら解説します。

java.timeパッケージの主な特徴は以下の通りです。

不変性 (Immutable): 日時オブジェクトは一度作成されると変更できません。これにより、スレッドセーフなプログラミングが容易になります。

明確なAPI: 各クラスの役割が明確で、直感的に操作できます。

ISO 8601準拠: 国際標準規格に準拠しており、異なるシステム間でのデータ交換が容易です。

多様なクラス: 日付、時刻、期間、タイムゾーンなど、様々な日時関連のクラスが用意されています。

日付の操作:LocalDate

LocalDateクラスは、日付(年、月、日)を表します。LocalDateオブジェクトの生成、日付の取得、日付の計算などの基本的な操作を見ていきましょう。

LocalDateオブジェクトの生成

LocalDateオブジェクトは、now()メソッド、of()メソッドなどを使って生成できます。

import java.time.LocalDate;

public class LocalDateExample {
    public static void main(String[] args) {
        // 現在の日付を取得
        LocalDate today = LocalDate.now();
        System.out.println("今日の日付: " + today);

        // 特定の日付を指定
        LocalDate specificDate = LocalDate.of(2024, 1, 1);
        System.out.println("特定の日付: " + specificDate);

        // 文字列から日付をパース
        LocalDate parsedDate = LocalDate.parse("2024-07-20");
        System.out.println("パースされた日付: " + parsedDate);
    }
}

日付の取得

LocalDateオブジェクトから、年、月、日などの情報を取得できます。

LocalDate today = LocalDate.now();
int year = today.getYear();
int month = today.getMonthValue();
int day = today.getDayOfMonth();
System.out.println("年: " + year + ", 月: " + month + ", 日: " + day);

日付の計算

plusDays(), minusDays(), plusWeeks(), minusWeeks(), plusMonths(), minusMonths(), plusYears(), minusYears()などのメソッドを使って、日付を計算できます。

LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plusDays(1);
LocalDate yesterday = today.minusDays(1);
System.out.println("明日: " + tomorrow);
System.out.println("昨日: " + yesterday);

日付の比較

isBefore(), isAfter(), isEqual()などのメソッドを使って、日付を比較できます。

LocalDate date1 = LocalDate.of(2024, 1, 1);
LocalDate date2 = LocalDate.of(2024, 1, 2);
System.out.println("date1 is before date2: " + date1.isBefore(date2));
System.out.println("date1 is after date2: " + date1.isAfter(date2));
System.out.println("date1 is equal to date2: " + date1.isEqual(date2));

時刻の操作:LocalTime

LocalTimeクラスは、時刻(時、分、秒、ナノ秒)を表します。LocalTimeオブジェクトの生成、時刻の取得、時刻の計算などの基本的な操作を見ていきましょう。

LocalTimeオブジェクトの生成

LocalTimeオブジェクトは、now()メソッド、of()メソッドなどを使って生成できます。

import java.time.LocalTime;

public class LocalTimeExample {
    public static void main(String[] args) {
        // 現在の時刻を取得
        LocalTime now = LocalTime.now();
        System.out.println("現在の時刻: " + now);

        // 特定の時刻を指定
        LocalTime specificTime = LocalTime.of(10, 30, 0);
        System.out.println("特定の時刻: " + specificTime);

        // 文字列から時刻をパース
        LocalTime parsedTime = LocalTime.parse("15:45:30");
        System.out.println("パースされた時刻: " + parsedTime);
    }
}

時刻の取得

LocalTimeオブジェクトから、時、分、秒などの情報を取得できます。

LocalTime now = LocalTime.now();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
System.out.println("時: " + hour + ", 分: " + minute + ", 秒: " + second);

時刻の計算

plusHours(), minusHours(), plusMinutes(), minusMinutes(), plusSeconds(), minusSeconds()などのメソッドを使って、時刻を計算できます。

LocalTime now = LocalTime.now();
LocalTime later = now.plusHours(2);
LocalTime earlier = now.minusMinutes(30);
System.out.println("2時間後: " + later);
System.out.println("30分前: " + earlier);

時刻の比較

isBefore(), isAfter(), isEqual()などのメソッドを使って、時刻を比較できます。

LocalTime time1 = LocalTime.of(10, 0, 0);
LocalTime time2 = LocalTime.of(10, 30, 0);
System.out.println("time1 is before time2: " + time1.isBefore(time2));
System.out.println("time1 is after time2: " + time1.isAfter(time2));
System.out.println("time1 is equal to time2: " + time1.isEqual(time2));

日付と時刻の組み合わせ:LocalDateTime

LocalDateTimeクラスは、日付と時刻を組み合わせたものを表します。LocalDateTimeオブジェクトの生成、日付と時刻の取得、日付と時刻の計算などの基本的な操作を見ていきましょう。

import java.time.LocalDateTime;

public class LocalDateTimeExample {
    public static void main(String[] args) {
        // 現在の日時を取得
        LocalDateTime now = LocalDateTime.now();
        System.out.println("現在の日時: " + now);

        // 特定の日時を指定
        LocalDateTime specificDateTime = LocalDateTime.of(2024, 1, 1, 10, 30, 0);
        System.out.println("特定の日時: " + specificDateTime);

        // LocalDateとLocalTimeからLocalDateTimeを生成
        LocalDate date = LocalDate.of(2024, 7, 20);
        LocalTime time = LocalTime.of(15, 45, 30);
        LocalDateTime combinedDateTime = LocalDateTime.of(date, time);
        System.out.println("結合された日時: " + combinedDateTime);
    }
}

期間の表現:PeriodとDuration

Periodクラスは、日付ベースの期間(年、月、日)を表し、Durationクラスは、時間ベースの期間(秒、ナノ秒)を表します。これらのクラスを使うことで、期間の計算や表現が容易になります。

Period

import java.time.LocalDate;
import java.time.Period;

public class PeriodExample {
    public static void main(String[] args) {
        LocalDate startDate = LocalDate.of(2023, 1, 1);
        LocalDate endDate = LocalDate.of(2024, 1, 1);

        // 期間を計算
        Period period = Period.between(startDate, endDate);
        System.out.println("期間: " + period.getYears() + "年, " + period.getMonths() + "ヶ月, " + period.getDays() + "日");
    }
}

Duration

import java.time.Duration;
import java.time.LocalTime;

public class DurationExample {
    public static void main(String[] args) {
        LocalTime startTime = LocalTime.of(10, 0, 0);
        LocalTime endTime = LocalTime.of(12, 30, 0);

        // 期間を計算
        Duration duration = Duration.between(startTime, endTime);
        System.out.println("期間: " + duration.toHours() + "時間, " + duration.toMinutesPart() + "分");
    }
}

参考リンク

まとめ

java.timeパッケージは、Javaでの日時操作をより簡単かつ安全に行うための強力なツールです。LocalDate, LocalTime, LocalDateTime, Period, Durationなどのクラスを理解し、適切に使いこなすことで、日時に関する様々な処理を効率的に実装できます。この記事を参考に、java.timeパッケージを活用して、より洗練されたJavaアプリケーションを開発してください。