【Java入門】Calendarクラスで日付の操作方法

入門

Javaでは、Calendarクラスを使用して、現在の日時の取得・演算・日時を比較などを行うことができます。
Calendarクラスは、Javaでプログラムを書く際に結構な頻度で出てくるので、この際に使い方を覚えていってください。
※今回使用するCalendarクラスは、java.util.Calendar なので、間違えて別のCalendarクラスをインポートしないように気をつけてください。

Calendarクラスのフィールド変数

フィールド名説明
AM_PM HOURの値が午後であるか午前であるかを示します。
DATE日にちをを示します。
DAY_OF_WEEK曜日を示します。
下記Calendarクラスの定数にて判定できます。
Calendar.SUNDAY
Calendar.MONDAY
Calendar.TUESDAY
Calendar.WEDNESDAY
Calendar.TURSDAY
Calendar.FRIDAY
Calendar.SATURDAY
DAY_OF_WEEK_IN_MONTH現在の月の何度目の曜日かを示します。
DAY_OF_YEAR現在の年の何日目かを示します。年の最初の日には、値 1 が使用されます。
ERAユリウス暦の AD または BC などの年代を示します。
HOUR午前または午後の何時かを示します。HOUR は 12 時間制 (0 から 11) です。正午および深夜零時は、12 ではなく 0 で表されます。たとえば、10:04:15.250 PM の場合、HOUR は 10 になります。
HOUR_OF_DAY時間を示します。HOUR_OF_DAY は 24 時間制です。たとえば、10:04:15.250 PM の場合、HOUR_OF_DAY は 22 になります。
MILLISECONDミリ秒を示します。たとえば、10:04:15.250 PM の場合、MILLISECOND は 250 になります。
MINUTE分を示します。たとえば、10:04:15.250 PM の場合、MINUTE は 4 になります。
MONTH月を示します。これはカレンダ固有の値です。グレゴリオ暦とユリウス暦の年の最初の月は JANUARY で、0 となります。最後の月は、1 年の月の数によります。
SECOND秒を示します。たとえば、10:04:15.250 PM の場合、SECOND は 15 になります。
WEEK_OF_MONTH現在の月の週番号を示します。getFirstDayOfWeek() および getMinimalDaysInFirstWeek() で定義される月の最初の週には、値 1 が使用されます。サブクラスでは、月の最初の週より前の日に対して WEEK_OF_MONTH の値が定義されます。
WEEK_OF_YEAR現在の年の週番号を示します。getFirstDayOfWeek() および getMinimalDaysInFirstWeek() で定義される年の最初の週には、値 1 が使用されます。サブクラスでは、年の最初の週より前の日に対して WEEK_OF_YEAR の値が定義されます。
YEAR年を示します。これはカレンダ固有の値です。
ZONE_OFFSETGMT から直接計算したオフセットをミリ秒単位で示します。

Calendarクラスの主要メソッド

インスタンスの生成方法

Calendarクラスは、new演算子を使用しての生成ではなく、getInstance メソッドを使用します。
Calendarクラスのインスタンス生成は下記のようなコードを使用します。
getInstance メソッドは、生成時の日時にてCalendarオブジェクトにて初期化されるようになっています。

Calendar calendar = Calendar.getInstance();

日時に関する情報の取得

取得したい値をCalendarクラスのフィールド変数にて指定して値を取得することが出来ます。

calendar.get(int field);

日時の設定

指定されたCalendarクラスのフィールド変数を指定された値に設定します。

calendar.set(int field, int value);

使用例

//カレンダーイスタンスの作成
Calendar calendar = Calendar.getInstance();
System.out.println("現在日付:" + calendar.getTime());

// 2000年に設定
calendar.set(Calendar.YEAR, 2000);
System.out.println("2000年に設定:" + calendar.getTime());
// 10月に設定
calendar.set(Calendar.MONTH, 10);
System.out.println("10月に設定:" + calendar.getTime());
// 5日に設定
calendar.set(Calendar.DATE, 5);
System.out.println("5日に設定:" + calendar.getTime());

//まとめて設定
calendar.set(2005, 12 , 12);
System.out.println("まとめて設定:" + calendar.getTime());

結果

現在日付:Fri Nov 04 22:56:39 JST 2022
2000年に設定:Sat Nov 04 22:56:39 JST 2000
10月に設定:Sat Nov 04 22:56:39 JST 2000
5日に設定:Sun Nov 05 22:56:39 JST 2000
まとめて設定:Thu Jan 12 22:56:39 JST 2006

日時の計算

カレンダの規則に基づいて、指定された時間量を指定されたCalendarクラスのフィールド変数に加算または減算します。

calendar.add(int field, int amount);

使用例

//カレンダーイスタンスの作成
Calendar calendar = Calendar.getInstance();
System.out.println("現在日付:" + calendar.getTime());

// 10年後
calendar.add(Calendar.YEAR, 10);
System.out.println("10年後:" + calendar.getTime());
// 5ヶ月前
calendar.add(Calendar.MONTH, -5);
System.out.println("5ヶ月前:" + calendar.getTime());
// 3日後
calendar.add(Calendar.DATE, 3);
System.out.println("3日後:" + calendar.getTime());

結果

現在日付:Fri Nov 04 23:01:55 JST 2022
10年後:Thu Nov 04 23:01:55 JST 2032
5ヶ月前:Fri Jun 04 23:01:55 JST 2032
3日後:Mon Jun 07 23:01:55 JST 2032

日時の比較

2つのCalendarオブジェクトで表される時間値を比較します。
戻り値として、2つの日時が等しい場合の値は0。引数で表される時間より前の場合は0未満の値。引数で表される時間よりあとの場合は、0 より大きい値。になります。

calendar.compareTo(Calendar anotherCalendar)

使用例

// 現在日付のイスタンスの作成
Calendar nowCalendar = Calendar.getInstance();
System.out.println("現在日付:" + nowCalendar.getTime());

// 比較対象日付のイスタンスの作成
Calendar calendar = Calendar.getInstance();
calendar.set(2020, 10, 10);
System.out.println("比較対象日付:" + nowCalendar.getTime());

if(nowCalendar.compareTo(calendar) == 0 ) {
    System.out.println("比較対象日付と現在日付は等しいです。");
} else if(nowCalendar.compareTo(calendar) < 0) {
    System.out.println("現在日付の方が遅いです。");
} else if(nowCalendar.compareTo(calendar) > 0) {
    System.out.println("現在日付の方が早いです。");
}

結果

現在日付:Fri Nov 04 23:17:35 JST 2022
比較対象日付:Fri Nov 04 23:17:35 JST 2022
現在日付の方が遅いです。

まとめ

日付の処理を行う際には必須と言ってもいいぐらいに使用頻度が高いためここで使い方を覚えていってください。これ以外にも様々なメソッドがCalendarクラスに準備されているのでぜひ調べていってください。

入門
おすすめ書籍
現役エンジニアの気ままブログ

コメント

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