Javaの日付・時刻フィールドとは?TemporalFieldとChronoFieldの基本を解説
日付・時刻フィールド(Temporal Field)とは
日付・時刻フィールド(temporal field)とは、「月の何日」「年の何日目」のように、日付や時刻を構成する個々の要素を表す単位のことです。Javaでは、このようなフィールドは java.time.temporal.TemporalField インターフェースとして抽象化されており、標準的なフィールド一式は java.time.temporal.ChronoField 列挙型が実装しています。
ChronoField には日付関連のフィールドだけでなく、時刻関連のフィールド(HOUR_OF_DAY、MINUTE_OF_HOUR、SECOND_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() メソッドによる値の取得
LocalDate や LocalDateTime などの日付・時刻クラスが持つ 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が標準的な定義を提供します。 LocalDateやLocalDateTimeのget()/getLong()にフィールドを渡すだけで、個々の値を簡単に取り出せます。EPOCH_DAYのように大きな値になるフィールドはgetLong()を使用しましょう。
-
Javaのクラスメソッド(静的メソッド)とは?基本から使い方まで解説
Javaにおけるクラスメソッド(静的メソッド)とは、特定のオブジェクトのインスタンスではなく、クラスそのものに対して呼び出されるメソッドのことです。static修飾子を付けることで、すべてのクラスインスタンス間で同じ実装が保証されます。静的メソッドはインスタンス化せずに呼び出すことができるため、アクセスできるのはクラス内の他の静的メンバー(staticなフィールドやメソッド)のみです。インスタンス変数や非staticメソッドには直接アクセスできない点に注意しましょう。Javaの標準ライブラリにも多くの静的メソッドが用意されています。代表的な例としては、Math.random()、System.
-
Javaにおける到達不能なcatchブロックとは?原因とコンパイルエラーの仕組みを解説
到達不能ブロック(Unreachable Block)とはどのような状況でも制御が決して到達しない文のまとまりは、到達不能ブロック(unreachable block)と呼ばれます。Javaでは、このような到達不能なコードはサポートされておらず、コンパイルエラーとなります。特に複数のcatchブロックを記述する場合には注意が必要です。Exceptionクラスを参照するcatchブロックは必ず最後に配置しなければなりません。これは、Exceptionがすべての例外クラスのスーパークラス(親クラス)であるためです。つまり、複数のcatchブロックを並べる際には、具体的な例外クラスから順に、より一般