Java GregorianCalendar クラス

GregorianCalendar は Java で西暦(グレゴリオ暦)を表すカレンダークラスであり、Calendar クラスを継承しています。このクラスは標準のカレンダーシステムを提供し、世界のほとんどの国で使用されているカレンダーシステムです。

GregorianCalendar クラスは java.util パッケージに含まれており、日付と時刻に関連する操作を処理するために使用されます。西暦1年から未来までの日付計算をサポートし、うるう年などの複雑な暦の規則を考慮しています。


GregorianCalendar の基本使用

GregorianCalendar インスタンスの作成

GregorianCalendar インスタンスを作成するには、いくつかの方法があります。

例

// 現在の日付と時刻を表すインスタンスを作成
GregorianCalendar calendar1 = new GregorianCalendar();

// 指定した年、月、日でインスタンスを作成
// 注意:月は0から始まり、0は1月を表します
GregorianCalendar calendar2 = new GregorianCalendar(2023, 10, 15);

// 年、月、日、時、分を指定してインスタンスを作成
GregorianCalendar calendar3 = new GregorianCalendar(2023, 10, 15, 14, 30);

// 年、月、日、時、分、秒を指定してインスタンスを作成
GregorianCalendar calendar4 = new GregorianCalendar(2023, 10, 15, 14, 30, 45);

日付と時刻の情報を取得

例

GregorianCalendar calendar = new GregorianCalendar();

int year = calendar.get(Calendar.YEAR);       // 年を取得
int month = calendar.get(Calendar.MONTH);    // 月を取得 (0-11)
int day = calendar.get(Calendar.DAY_OF_MONTH); // 日を取得
int hour = calendar.get(Calendar.HOUR_OF_DAY); // 時を取得 (24時間制)
int minute = calendar.get(Calendar.MINUTE);   // 分を取得
int second = calendar.get(Calendar.SECOND);   // 秒を取得

日付と時刻を設定

例

GregorianCalendar calendar = new GregorianCalendar();

// 年を設定
calendar.set(Calendar.YEAR, 2024);

// 月を設定 (0-11)
calendar.set(Calendar.MONTH, Calendar.JANUARY);

// 日を設定
calendar.set(Calendar.DAY_OF_MONTH, 1);

// 年・月・日を同時に設定
calendar.set(2024, Calendar.JANUARY, 1);

GregorianCalendar の一般的なメソッド

日付計算

例

GregorianCalendar calendar = new GregorianCalendar(2023, Calendar.NOVEMBER, 15);

// 10日加算
calendar.add(Calendar.DAY_OF_MONTH, 10);

// 2か月減算
calendar.add(Calendar.MONTH, -2);

日付の比較

例

GregorianCalendar cal1 = new GregorianCalendar(2023, Calendar.NOVEMBER, 15);
GregorianCalendar cal2 = new GregorianCalendar(2023, Calendar.DECEMBER, 25);

// 2つの日付を比較
int result = cal1.compareTo(cal2);  // cal1がcal2より前なら負の数、後なら正の数、等しければ0を返す

// 特定の日付より前かどうかを判定
boolean isBefore = cal1.before(cal2);

// 特定の日付より後かどうかを判定
boolean isAfter = cal1.after(cal2);

閏年の判定

例

// 指定された年が閏年かどうかを判定
boolean isLeapYear = new GregorianCalendar().isLeapYear(2024);

Date オブジェクトへの変換

例

GregorianCalendar calendar = new GregorianCalendar();
Date date = calendar.getTime();

Date オブジェクトから設定

例

Date date = new Date();
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);

日付のフォーマット出力

GregorianCalendar 自体はフォーマットのメソッドを提供しませんが、SimpleDateFormat と組み合わせて使用できます:

例

GregorianCalendar calendar = new GregorianCalendar(2023, Calendar.NOVEMBER, 15, 14, 30);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = sdf.format(calendar.getTime());
System.out.println(formattedDate);  // 出力: 2023-11-15 14:30:00

注意事項

月は 0 から始まる

GregorianCalendar では月は 0 から始まり、0 は 1 月、11 は 12 月を表します。コードの可読性のため、Calendar クラスで定義された定数を使用することをお勧めします:

例

// 非推奨
new GregorianCalendar(2023, 10, 15);

// 推奨
new GregorianCalendar(2023, Calendar.NOVEMBER, 15);

スレッド安全性

GregorianCalendar はスレッドセーフではありません。マルチスレッド環境で使用する必要がある場合は、同期処理を行うか、スレッドごとに個別のインスタンスを作成する必要があります。

代替案

Java 8 以降では、新しい日時 API(java.time パッケージのクラス)である LocalDate、LocalDateTime などを使用することをお勧めします。これらは設計がより合理的で、使いやすくなっています。


完全な例

例

import java.util.GregorianCalendar;
import java.util.Calendar;
import java.text.SimpleDateFormat;

public class GregorianCalendarExample {
    public static void main(String[] args) {
        // 現在の日付のインスタンスを作成
        GregorianCalendar calendar = new GregorianCalendar();
       
        // 現在の日付と時刻を表示
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("現在の時刻: " + sdf.format(calendar.getTime()));
       
        // 今年が閏年かどうかを判定
        int year = calendar.get(Calendar.YEAR);
        boolean isLeap = calendar.isLeapYear(year);
        System.out.println(year + "年" + (isLeap ? "はい" : "いいえ") + "閏年");
       
        // 30日加算
        calendar.add(Calendar.DAY_OF_MONTH, 30);
        System.out.println("30日後: " + sdf.format(calendar.getTime()));
       
        // 特定の日付のインスタンスを作成
        GregorianCalendar birthday = new GregorianCalendar(1990, Calendar.JULY, 15);
        System.out.println("誕生日: " + sdf.format(birthday.getTime()));
    }
}

出力結果は次のとおりです:

当前时间: 2025-05-01 11:37:43
2025年不是闰年
30天后: 2025-05-31 11:37:43
生日: 1990-07-15 00:00:00

メソッドのまとめ

GregorianCalendar は Calendar の具体的な実装クラスです。以下はその一般的なメソッドです:

コンストラクタ

メソッド 説明
GregorianCalendar() デフォルトのタイムゾーンと言語環境を使用してオブジェクトを作成
GregorianCalendar(int year, int month, int dayOfMonth) 年・月・日を指定してオブジェクトを作成
GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute) 年・月・日・時・分を指定してオブジェクトを作成
GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, int second) 年・月・日・時・分・秒を指定してオブジェクトを作成
GregorianCalendar(Locale locale) デフォルトのタイムゾーンと指定された言語環境を使用してオブジェクトを作成
GregorianCalendar(TimeZone zone) 指定されたタイムゾーンとデフォルトの言語環境を使用してオブジェクトを作成
GregorianCalendar(TimeZone zone, Locale locale) 指定されたタイムゾーンと言語環境を使用してオブジェクトを作成

特有メソッド

メソッド 説明
boolean isLeapYear(int year) 指定された年が閏年かどうかを判定
void setGregorianChange(Date date) ユリウス暦からグレゴリオ暦への変換日を設定
Date getGregorianChange() ユリウス暦からグレゴリオ暦への変換日を取得

Calendar から継承した一般的なメソッド

メソッド 説明
int get(int field) 指定されたフィールドの値を取得
void set(int field, int value) 指定されたフィールドの値を設定
void add(int field, int amount) 指定された時間量を加算または減算
void roll(int field, int amount) より大きいフィールドを変更せずに時間量を加算または減算
boolean after(Object when) 指定された時間より後かどうかを判定
boolean before(Object when) 指定された時間より前かどうかを判定
long getTimeInMillis() 時間値を返す(ミリ秒)
void setTimeInMillis(long millis) ミリ秒の時間値で Calendar を設定
Date getTime() 対応する Date オブジェクトを返す
void setTime(Date date) Date を使用して時間を設定

フィールド定数(Calendar から継承)

フィールド 説明
YEAR 年のフィールド
MONTH 月のフィールド(0-11)
DATE / DAY_OF_MONTH 月内の日数
DAY_OF_WEEK 曜日(1-7、1=日曜日)
HOUR 12時間制の時
HOUR_OF_DAY 24時間制の時
MINUTE 分
SECOND 秒
MILLISECOND ミリ秒
AM_PM 午前または午後
その他の拡張