Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaの日付・時刻フィールドとは?TemporalFieldとChronoFieldの基本を解説


日付・時刻フィールド(Temporal Field)とは

日付・時刻フィールド(temporal field)とは、「月の何日」「年の何日目」のように、日付や時刻を構成する個々の要素を表す単位のことです。Javaでは、このようなフィールドは java.time.temporal.TemporalField インターフェースとして抽象化されており、標準的なフィールド一式は java.time.temporal.ChronoField 列挙型が実装しています。

ChronoField には日付関連のフィールドだけでなく、時刻関連のフィールド(HOUR_OF_DAYMINUTE_OF_HOURSECOND_OF_MINUTE など)も多数用意されています。ここでは、まず日付に関連する主なフィールドを確認しましょう。

ChronoField の主な日付フィールド

フィールド説明
ALIGNED_DAY_OF_WEEK_IN_MONTH月の中で整列された曜日を表します。月の1日を起点に7日ごとの週区切りの中で、その日が何番目の曜日に相当するかを返します。
ALIGNED_DAY_OF_WEEK_IN_YEAR年の中で整列された曜日を表します。年の1月1日を起点とした週区切りの中での曜日の位置を返します。
ALIGNED_WEEK_OF_MONTH月の中で整列された週(1日から数えて第何週か)を表します。
ALIGNED_WEEK_OF_YEAR年の中で整列された週(1月1日から数えて第何週か)を表します。
DAY_OF_MONTH月の中の日付(1〜31)を表します。
DAY_OF_WEEK曜日を表します。ISO規格では月曜日が1、日曜日が7となります。
DAY_OF_YEAR年の中の通算日(1〜366)を表します。
EPOCH_DAYエポック日を表します。1970年1月1日を0として数えた通算日数です。値が大きくなるため、取得には getLong() を使用します。
ERA紀元を表します。ISO暦では西暦(CE)が1、紀元前(BCE)が0になります。
YEAR年を表します。
YEAR_OF_ERA紀元の中での年(紀元年)を表します。

get() / getLong() メソッドによる値の取得

LocalDateLocalDateTime などの日付・時刻クラスが持つ get() / getLong() メソッドは、引数として TemporalField を受け取り、そのオブジェクトが保持する日付・時刻から指定フィールドの値を取り出します。

  • get():戻り値が int 型。ほとんどのフィールドはこちらで取得できます。
  • getLong():戻り値が long 型。EPOCH_DAY のように int の範囲を超える可能性があるフィールドに使用します。

サンプルコード1:LocalDate から日付フィールドを取得する

import java.time.LocalDate;
import java.time.temporal.ChronoField;

public class Demo {
    public static void main(String args[]) {
        // LocalDateクラスのインスタンスを生成
        LocalDate lDate = LocalDate.now();

        int field = lDate.get(ChronoField.DAY_OF_MONTH);
        System.out.println("月の日: " + field);

        field = lDate.get(ChronoField.DAY_OF_WEEK);
        System.out.println("曜日: " + field);

        field = lDate.get(ChronoField.DAY_OF_YEAR);
        System.out.println("年の通算日: " + field);

        long epoch = lDate.getLong(ChronoField.EPOCH_DAY);
        System.out.println("エポック日: " + epoch);

        field = lDate.get(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH);
        System.out.println("月内の整列曜日: " + field);

        field = lDate.get(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR);
        System.out.println("年内の整列曜日: " + field);

        field = lDate.get(ChronoField.ERA);
        System.out.println("紀元: " + field);
    }
}

実行結果

月の日: 11
曜日: 3
年の通算日: 316
エポック日: 18577
月内の整列曜日: 4
年内の整列曜日: 1
紀元: 1

この実行結果から、対象の日付が「月の11日目・火曜日(3)・年の316日目」であり、ERA の値が 1 であることから西暦(CE)であることがわかります。

サンプルコード2:Year・Month・DayOfWeek からフィールドを取得する

import java.time.DayOfWeek;
import java.time.LocalTime;
import java.time.Month;
import java.time.Year;
import java.time.temporal.ChronoField;

public class Demo {
    public static void main(String args[]) {
        // LocalTimeクラスのインスタンスを生成
        LocalTime lTime = LocalTime.now();
        System.out.println(lTime);

        int field = Year.of(2019).get(ChronoField.YEAR);
        System.out.println("年: " + field);

        field = Month.of(8).get(ChronoField.MONTH_OF_YEAR);
        System.out.println("月: " + field);

        field = DayOfWeek.of(3).get(ChronoField.DAY_OF_WEEK);
        System.out.println("曜日: " + field);
    }
}

実行結果

20:01:43.171
年: 2019
月: 8
曜日: 3

Year.of(2019)Month.of(8)DayOfWeek.of(3) のように生成したオブジェクトに対しても、同様に get() メソッドを使って対応するフィールドの値を取得できます。

まとめ

  • 日付・時刻フィールドは TemporalField インターフェースで表現され、ChronoField が標準的な定義を提供します。
  • LocalDateLocalDateTimeget() / getLong() にフィールドを渡すだけで、個々の値を簡単に取り出せます。
  • EPOCH_DAY のように大きな値になるフィールドは getLong() を使用しましょう。

  1. Javaのクラスメソッド(静的メソッド)とは?基本から使い方まで解説

    Javaにおけるクラスメソッド(静的メソッド)とは、特定のオブジェクトのインスタンスではなく、クラスそのものに対して呼び出されるメソッドのことです。static修飾子を付けることで、すべてのクラスインスタンス間で同じ実装が保証されます。静的メソッドはインスタンス化せずに呼び出すことができるため、アクセスできるのはクラス内の他の静的メンバー(staticなフィールドやメソッド)のみです。インスタンス変数や非staticメソッドには直接アクセスできない点に注意しましょう。Javaの標準ライブラリにも多くの静的メソッドが用意されています。代表的な例としては、Math.random()、System.

  2. Javaにおける到達不能なcatchブロックとは?原因とコンパイルエラーの仕組みを解説

    到達不能ブロック(Unreachable Block)とはどのような状況でも制御が決して到達しない文のまとまりは、到達不能ブロック(unreachable block)と呼ばれます。Javaでは、このような到達不能なコードはサポートされておらず、コンパイルエラーとなります。特に複数のcatchブロックを記述する場合には注意が必要です。Exceptionクラスを参照するcatchブロックは必ず最後に配置しなければなりません。これは、Exceptionがすべての例外クラスのスーパークラス(親クラス)であるためです。つまり、複数のcatchブロックを並べる際には、具体的な例外クラスから順に、より一般