GregorianCalendar (Java SE 11 & JDK 11 ) (original) (raw)


public class GregorianCalendar
extends Calendar
GregorianCalendarは、Calendarの具象サブクラスであり、世界のほとんどの地域で使用される標準的な暦体系を提供します。
GregorianCalendarは、グレゴリオ暦とユリウス暦をサポートするハイブリッド・カレンダで、単一の変わり目を処理します。この変わり目は、デフォルトでは、グレゴリオ暦が制定された日(一部の国では1582年10月15日、その他の国ではそれ以後)に対応しています。 切換え日は、呼出し側でsetGregorianChange()を呼び出して変更できます。
歴史的に、グレゴリオ暦を最初に採用した国々では、1582年10月4日(ユリウス歴)のあとに1582年10月15日(グレゴリオ歴)が続きました。 このカレンダはこれを正確にモデル化しています。 グレゴリオ暦への切換え日の前は、GregorianCalendarではユリウス暦を実装しています。 グレゴリオ暦とユリウス暦の唯一の違いはうるう年のルールです。 ユリウス暦は4年ごとにうるう年を指定しますが、グレゴリオ暦では、400で割り切れない世紀の初年をうるう年にしません。
GregorianCalendarは、_先発_グレゴリオ暦およびユリウス暦を実装します。 すなわち、日付の計算では、現在のルールを無限の過去あるいは未来に向けて適用します。 このため、GregorianCalendarはすべての年について一貫した結果を生成するために使用できます。 ただし、GregorianCalendarを使用して得られた日付は、歴史的に、現代と同様のユリウス暦が採用されたAD 4年3月1日以降の日付だけが正確です。 この日付より前には、うるう年のルールは不規則に適用されており、BC 45年以前にはユリウス暦は存在さえしていませんでした。
グレゴリオ暦の制定より前は、元日は3月25日でした。 混乱を避けるために、このカレンダでは常に1月1日を使います。 必要であれば、グレゴリオ暦より前の日付に対し、1月1日から3月24日の間の日に調整することができます。

年の何週目かを表す値および暦週の基準年

WEEK_OF_YEARフィールドに対して計算される値の範囲は、1から53です。 暦年の最初の週は、その年から少なくともgetMinimalDaysInFirstWeek()日を含むgetFirstDayOfWeek()で始まるもっとも早い7日間です。 したがって、最初の週は、getMinimalDaysInFirstWeek()の値、 getFirstDayOfWeek()の値、および1月1日の曜日により変化します。 ある年の第1週から翌年の第1週までの週(その週は含まない)は、必要に応じて2から52または53まで順に番号が付けられます(ユリウス暦からグレゴリオ暦へ移行に含まれる年を除く)。
GregorianCalendarを構築するとき、getFirstDayOfWeek()および getMinimalDaysInFirstWeek()の値は、ロケールに依存したリソースを使用して初期化されます。 getFirstDayOfWeek()MONDAY getMinimalDaysInFirstWeek()が4の場合、週の決定はISO 8601に準拠し、これらの値は、標準の設定が優先されるロケールで使用されます。 これらの値は、setFirstDayOfWeek()およびsetMinimalDaysInFirstWeek()を呼び出すことによって明示的に設定できます。
_暦週の基準年_は、WEEK_OF_YEARのサイクルと同期がとられます。 最初の週と最後の週の間にあるすべての週(両端の週を含む)の_暦週の基準年_は、同じ値になります。 したがって、暦週の基準年が同じでも、最初の日と最後の日では暦年の値が異なる場合があります。
たとえば、1998年1月1日は木曜日です。 getFirstDayOfWeek()MONDAY getMinimalDaysInFirstWeek()が4 (ISO 8601規格に準拠した設定)の場合、1998年の第1週は1997年12月29日に始まり1998年1月4日で終わります。 暦年が1997年の最後の3日については、暦週の基準年が1998になります。 ただし、getFirstDayOfWeek()SUNDAYの場合、1998年の第1週は1998年1月4日に始まり1998年1月10日に終わります。1998年の最初の3日間は1997年の第53週に入り、それらの日の暦週の基準年は1997です。

月の何週目かを表す週(Week Of Month)

WEEK_OF_MONTHフィールドに対して計算される値の範囲は、0から6です。 月の第1週(WEEK_OF_MONTH = 1の日)は、その月で少なくともgetMinimalDaysInFirstWeek()日間連続するもっとも早い週になり、getFirstDayOfWeek()の前日までです。 年の第1週とは異なり、月の第1週は7日より短いことがあり、getFirstDayOfWeek()で始まる必要はなく、前の月の日は含まれません。 第1週より前にあるその月の日については、WEEK_OF_MONTHの値は0です。
たとえば、getFirstDayOfWeek()SUNDAYgetMinimalDaysInFirstWeek()が4の場合、1998年1月の第1週は、1月4日の日曜日から1月10日の土曜日になります。 これらの日のWEEK_OF_MONTHの値は1です。 1月1日の木曜日から1月3日の土曜日までのWEEK_OF_MONTHの値は0です。 getMinimalDaysInFirstWeek()の値が3に変更されると、1月1日から1月3日までのWEEK_OF_MONTHの値は1になります。

フィールドのデフォルト値

clearメソッドは、カレンダ・フィールドを未定義に設定します。 フィールドの値が未定義の場合、GregorianCalendarは、各カレンダ・フィールドに対して次のデフォルト値を使用します。
GregorianCalendar のフィールドのデフォルト値

フィールド デフォルト値
ERA AD
YEAR 1970
MONTH JANUARY
DAY_OF_MONTH 1
DAY_OF_WEEK the first day of week
WEEK_OF_MONTH 0
DAY_OF_WEEK_IN_MONTH 1
AM_PM AM
HOUR, HOUR_OF_DAY, MINUTE, SECOND, MILLISECOND 0

前述のリストに含まれないフィールドについては、デフォルト値は適用されません。
例:

// get the supported ids for GMT-08:00 (Pacific Standard Time)
String[] ids = TimeZone.getAvailableIDs(-8 * 60 * 60 * 1000);
// if no ids were returned, something is wrong. get out.
if (ids.length == 0)
System.exit(0);

// begin output
System.out.println("Current Time");

// create a Pacific Standard Time time zone
SimpleTimeZone pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]);

// set up rules for Daylight Saving Time
pdt.setStartRule(Calendar.APRIL, 1, Calendar.SUNDAY, 2 * 60 * 60 * 1000);
pdt.setEndRule(Calendar.OCTOBER, -1, Calendar.SUNDAY, 2 * 60 * 60 * 1000);

// create a GregorianCalendar with the Pacific Daylight time zone
// and the current date and time
Calendar calendar = new GregorianCalendar(pdt);
Date trialTime = new Date();
calendar.setTime(trialTime);

// print out a bunch of interesting things
System.out.println("ERA: " + calendar.get(Calendar.ERA));
System.out.println("YEAR: " + calendar.get(Calendar.YEAR));
System.out.println("MONTH: " + calendar.get(Calendar.MONTH));
System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR));
System.out.println("WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH));
System.out.println("DATE: " + calendar.get(Calendar.DATE));
System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH));
System.out.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR));
System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
System.out.println("DAY_OF_WEEK_IN_MONTH: "
+ calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM));
System.out.println("HOUR: " + calendar.get(Calendar.HOUR));
System.out.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE));
System.out.println("SECOND: " + calendar.get(Calendar.SECOND));
System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));
System.out.println("ZONE_OFFSET: "
+ (calendar.get(Calendar.ZONE_OFFSET)/(60601000)));
System.out.println("DST_OFFSET: "
+ (calendar.get(Calendar.DST_OFFSET)/(60601000)));

System.out.println("Current Time, with hour reset to 3");
calendar.clear(Calendar.HOUR_OF_DAY); // so doesn't override
calendar.set(Calendar.HOUR, 3);
System.out.println("ERA: " + calendar.get(Calendar.ERA));
System.out.println("YEAR: " + calendar.get(Calendar.YEAR));
System.out.println("MONTH: " + calendar.get(Calendar.MONTH));
System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR));
System.out.println("WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH));
System.out.println("DATE: " + calendar.get(Calendar.DATE));
System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH));
System.out.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR));
System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
System.out.println("DAY_OF_WEEK_IN_MONTH: "
+ calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM));
System.out.println("HOUR: " + calendar.get(Calendar.HOUR));
System.out.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE));
System.out.println("SECOND: " + calendar.get(Calendar.SECOND));
System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));
System.out.println("ZONE_OFFSET: "
+ (calendar.get(Calendar.ZONE_OFFSET)/(60601000))); // in hours
System.out.println("DST_OFFSET: "
+ (calendar.get(Calendar.DST_OFFSET)/(60601000))); // in hours

導入されたバージョン:
1.1
関連項目:
TimeZone, 直列化された形式