Java 8 の日付と時刻 API

JavaBeginner
オンラインで実践に進む

はじめに

Java 8 では、JodaTime ライブラリにインスパイアされた新しい日付と時刻 API が導入されました。これは既存の日付 API の欠点を克服しています。この実験では、新しい日付と時刻 API を使用して日付と時刻を操作する方法を学びます。

LocalDate インスタンスの作成

LocalDate クラスは、標準 ISO 形式 (yyyy - mm - dd) の日付を表すために使用されます。これには時間は含まれず、タイムゾーンもサポートしていません。

now() メソッドを使用して LocalDate クラスのインスタンスを作成することができます。これにより、システムのクロックに基づいて現在の日付が取得されます。

import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDate currentDate = LocalDate.now();
        System.out.println("Current Date: " + currentDate);
    }
}

以下のコマンドを使用してコードを保存して実行します。

javac DateTimeExample.java && java DateTimeExample

以下の出力が表示されます。

Current Date: 2021-08-13

日付文字列を解析する

日付の文字列表現を使用して、LocalDate クラスのインスタンスを作成することができます。

import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        String str = "2021-08-13";
        LocalDate date = LocalDate.parse(str);
        System.out.println("Date: " + date);
    }
}

以下のコマンドを使用してコードを保存して実行します。

javac DateTimeExample.java && java DateTimeExample

以下の出力が表示されます。

Date: 2021-08-13

加算と減算メソッド

plusDays() または minusDays() メソッドを使用して、日付から日、月、または年を加算または減算することができます。月と年を変更するための同様のメソッドもあります。

import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDate currDate = LocalDate.now();
        LocalDate yesterday = currDate.minusDays(1);
        LocalDate tomorrow = currDate.plusDays(1);

        System.out.println("Current Date: " + currDate);
        System.out.println("Tomorrow's Date: " + tomorrow);
        System.out.println("Yesterday's Date: " + yesterday);
    }
}

以下のコマンドを使用してコードを保存して実行します。

javac DateTimeExample.java && java DateTimeExample

以下の出力が表示されます。

Current Date: 2021-08-13
Tomorrow's Date: 2021-08-14
Yesterday's Date: 2021-08-12

ゲッターメソッド

LocalDate クラスには、LocalDate から曜日や日付などのさまざまな情報を取得するためのいくつかのゲッターメソッドが含まれています。

import java.time.DayOfWeek;
import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDate currDate = LocalDate.now();
        DayOfWeek dayOfWeek = currDate.getDayOfWeek();
        int dayOfMonth = currDate.getDayOfMonth();
        int dayOfYear = currDate.getDayOfYear();

        System.out.println("Date: " + currDate);
        System.out.println("Day of Week: " + dayOfWeek);
        System.out.println("Day of Month: " + dayOfMonth);
        System.out.println("Day of Year: " + dayOfYear);
    }
}

以下のコマンドを使用してコードを保存して実行します。

javac DateTimeExample.java && java DateTimeExample

以下の出力が表示されます。

Date: 2021-08-13
Day of Week: FRIDAY
Day of Month: 13
Day of Year: 225

日付の比較

どちらが大きいかを確認するために、isBefore() と isAfter() メソッドを使用して日付を比較することができます。

import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDate currDate = LocalDate.now();
        LocalDate tomorrow = currDate.plusDays(1);
        LocalDate yesterday = currDate.minusDays(1);

        System.out.println("Current date is after yesterday's date: " + currDate.isAfter(yesterday));
        System.out.println("Current date is before tomorrow's date: " + currDate.isBefore(tomorrow));
    }
}

以下のコマンドを使用してコードを保存して実行します。

javac DateTimeExample.java && java DateTimeExample

以下の出力が表示されます。

Current date is after yesterday's date: true
Current date is before tomorrow's date: true

LocalTime インスタンスの作成

LocalTime インスタンスを作成するには、now()、of()、または parse() メソッドを使用できます。now() メソッドは、システムのクロックを使用して現在の時刻を取得します。of() および parse() メソッドは、渡されたパラメータに基づいて LocalTime を作成できます。

import java.time.LocalTime;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalTime currentTime = LocalTime.now();
        LocalTime t1 = LocalTime.of(5, 32, 44);
        LocalTime t2 = LocalTime.parse("05:32:44");

        System.out.println(currentTime);
        System.out.println(t1);
        System.out.println(t2);
    }
}

以下のコマンドを使用してコードを保存して実行します。

javac DateTimeExample.java && java DateTimeExample

以下の出力が表示されます。

17:43:08.749240
05:32:44
05:32:44

加えると引く方法

LocalTime インスタンスを操作するために、plus() と minus() メソッドを使用できます。

import java.time.LocalTime;
import java.time.temporal.ChronoUnit;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalTime t1 = LocalTime.of(5, 32, 44);
        LocalTime t2 = t1.plus(2, ChronoUnit.HOURS);
        LocalTime t3 = t1.minusMinutes(10);

        System.out.println(t1);
        System.out.println(t2);
        System.out.println(t3);
    }
}

以下のコマンドを使用してコードを保存して実行します。

javac DateTimeExample.java && java DateTimeExample

以下の出力が表示されます。

05:32:44
07:32:44
05:22:44

LocalDateTime インスタンスの作成

LocalDateTime クラスは、LocalDate クラスと LocalTime クラスの組み合わせです。LocalDateTime インスタンスには日付コンポーネントと時刻コンポーネントが含まれています。

import java.time.LocalDateTime;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDateTime currDateTime = LocalDateTime.now();
        LocalDateTime dt1 = LocalDateTime.of(2020, 8, 13, 5, 32);
        LocalDateTime dt2 = LocalDateTime.parse("2020-08-13T05:32");

        System.out.println(currDateTime);
        System.out.println(dt1);
        System.out.println(dt2);
    }
}

以下のコマンドを使用してコードを保存して実行します。

javac DateTimeExample.java && java DateTimeExample

以下の出力が表示されます。

2021-08-13T17:46:48.837697
2020-08-13T05:32
2020-08-13T05:32

タイムゾーンの操作

上記で説明したクラスはタイムゾーンをサポートしていません。ZonedDateTime クラスがこの機能を提供します。異なるタイムゾーンを識別するために ZoneId クラスを使用できます。

import java.time.ZonedDateTime;
import java.time.ZoneId;

public class DateTimeExample {
    public static void main(String[] args) {
        ZonedDateTime zdt = ZonedDateTime.now();
        ZoneId zoneTokyo = ZoneId.of("Asia/Tokyo");
        ZonedDateTime zdtT = ZonedDateTime.now(zoneTokyo);
        ZoneId zoneLondon = ZoneId.of("Europe/London");
        ZonedDateTime zdtL = ZonedDateTime.now(zoneLondon);

        System.out.println(zdt);
        System.out.println(zdtT);
        System.out.println(zdtL);
    }
}

以下のコマンドを使用してコードを保存して実行します。

javac DateTimeExample.java && java DateTimeExample

以下の出力が表示されます。

2021-08-13T18:09:25.352237+05:30[Asia/Calcutta]
2021-08-13T21:39:25.356244+09:00[Asia/Tokyo]
2021-08-13T13:09:25.357316+01:00[Europe/London]

日付の書式設定

Java 8 では、特定のパターンを使用して日付を文字列に書式設定するための format() 関数が提供されています。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.now();
        String dateStr1 = dateTime.format(DateTimeFormatter.ISO_WEEK_DATE);
        String dateStr2 = dateTime.format(DateTimeFormatter.BASIC_ISO_DATE);
        String dateStr3 = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        String dateStr4 = dateTime.format(DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm:ss"));

        System.out.println(dateStr1);
        System.out.println(dateStr2);
        System.out.println(dateStr3);
        System.out.println(dateStr4);
    }
}

以下のコマンドを使用してコードを保存して実行します。

javac DateTimeExample.java && java DateTimeExample

以下の出力が表示されます。

2021-W32-5
20210813
2021-08-13T18:16:57.675704
13/08/2021 06:16:57

まとめ

この実験では、Java 8 の日付と時刻 API を使用して日付と時刻を操作する方法を学びました。LocalDate、LocalTime、および LocalDateTime クラスのインスタンスを作成する方法、plus() と minus() メソッドを使用して操作する方法、および getter メソッドを使用して情報を取得する方法を学びました。また、ZonedDateTime クラスを使用してタイムゾーンを操作し、DateTimeFormatter クラスを使用して日付を書式設定する方法も学びました。