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 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); // 秒を取得
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);
// 年を設定
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);
// 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);
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);
boolean isLeapYear = new GregorianCalendar().isLeapYear(2024);
Date オブジェクトへの変換
例
GregorianCalendar calendar = new GregorianCalendar();
Date date = calendar.getTime();
Date date = calendar.getTime();
Date オブジェクトから設定
例
Date date = new Date();
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(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
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);
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()));
}
}
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 |
午前または午後 |