パート1の紹介
カレンダーの定義:
パブリックアブストラクトクラスカレンダーは、シリアル化可能、クローン可能、同等の<カレンダー> {}を実装しますカレンダーは、抽象クラスと見なすことができます。
その実装は、設計パターンに工場法を採用しています。カレンダーインスタンスを取得すると、カレンダーは渡されたパラメーターに基づいて対応するカレンダーオブジェクトを返します。カレンダーインスタンスを取得するには2つの方法があります。
(1)calendar.getInstance()を介してカレンダーを取得すると、デフォルトはグレゴリアンカレンダーオブジェクトが返されます。
グレゴリアンカレンダーは、世界のほとんどの国で使用される標準的なカレンダーシステムを提供するカレンダーの実装クラスです。
(2)カレンダーをカレンダーを介してカレンダーを取得すると、getinstance(タイムゾーンタイムゾーン、ロケールロケール)またはカレンダー(タイムゾーンタイムゾーン)またはカレンダー.getInstance(ロケールロケール)を取得すると、「対応するタイムゾーン(ゾーン)または領域(ローカル)などで使用されるカレンダー」を返します。
たとえば、それが日本の場合、日本帝国のオブジェクトが返されます。
次のコードを参照してください。
public staticカレンダーgetInstance(){// CreateCalendar()を呼び出してカレンダーカレンダー= createCalendar(timezone.getDefaultref()、locale.getDefault()); cal.sharedzone = true; cal;} public staticカレンダーgetInstance(TimeZone Zone){// CreateCalendar()を呼び出してCreateCalendar(Zone、locale.getDefault()) cal.sharedzone = true; cal;} public staticカレンダーgetInstance(タイムゾーンゾーン、ロケールalocale){// createcalendar()を呼び出してCreateCalendar(ゾーン、アロカレ)を作成します。日本のンプルカレンダーオブジェクトを返しますif( "th" .equals(alocale.getlanguage())&&( "th" .equals(alocale.getcountry()))){return new sun.util.buddhistcalendar(ゾーン、alocale); } else if( "jp" .equals(alocale.getVariant())&& "jp" .equals(alocale.getCountry()))&& "ja" .equals(alocale.getlanguage()))) } //(03)それ以外の場合は、グレゴリアンカレンダーオブジェクトを返します。新しいグレゴリアンカレンダー(ゾーン、アロケール)を返します。 }カレンダーインスタンスを取得した後、カレンダーで提供されるいくつかの列メソッドを使用してカレンダーを操作できます。
パート2カレンダーの原則と考え
カレンダーを使用する場合、カレンダーの「年、月、日、週、時間、分、2番目」のフィールドを操作することにすぎません。以下では、これらのフィールドのソース、定義、計算方法を学びます。
1。各フィールド値のソースをカレンダー
カレンダーを使用するとき、「年、月、日、週、時間、分、2番目」などの情報を使用するだけです。では、どうやってそれをしたのでしょうか?基本的に、カレンダーは時間を節約します。次の定義:
//時間は現在の時間であり、ミリ秒単位です。 //現在の時間距離「1970年1月1日、0:00:00GMT」の違いです。長い間保護されています。
カレンダーは、「カレンダーの年、月、日、週、時間、分、秒」などの情報を計算します。
2。カレンダーの各フィールドの定義と初期化
カレンダーの「年、月、日、週、時間、分、2番目の2番目の情報」には、合計17のフィールドがあります。
カレンダーを使用します。カレンダーは、これらの17のフィールドにすぎません。それらの定義は次のとおりです。
(フィールド0)パブリック最終静的int era = 0;
説明:時代。
値:0または1。0はBC(「キリストの前」、つまりbc)を意味します。
(フィールド1)パブリック最終静的int year = 1;
説明:年。
(フィールド2)パブリック最終静的int month = 2;
説明:毎月の価値:1月、2月、3月、4月、5月、6月、7月、8月、9月、10月、11月、12月、undecimberにすることができます。
これの最初の月は1月、0です。
(フィールド3)パブリック最終static int week_of_year = 3;
注:現在の日付は、今年の週に対応しています。年の最初の週の価値は1です。
(フィールド4)パブリック最終static int week_of_month = 4;
注:現在の日付は、月の週に対応しています。月の最初の週の値は1です。
(フィールド5)パブリック最終静的int日付= 5;
説明:日。月の初日の値は1です。
(フィールド5)パブリック最終static int day_of_month = 5;
注:「日付」と同じ、「日」を意味します。
(フィールド6)パブリック最終static int day_of_year = 6;
注:現在の日付は今年に何日に対応していますか?年の初日の価値は1です。
(フィールド7)パブリック最終static int day_of_week = 7;
説明:曜日は何ですか。
値:日曜日、月曜日、火曜日、水曜日、木曜日、金曜日、土曜日にすることができます。
その中で、日曜日は1、月曜日は2などです。
(フィールド8)パブリック最終static int day_of_week_in_month = 8;
説明:今月の週。
値:day_of_month 1から7は、常にday_of_week_in_month 1に対応しています。 8〜14は、常にday_of_week_in_month 2などに対応しています。
(フィールド9)パブリック最終静的int am_pm = 9;
説明:朝または午後の価値:AMまたはPMにすることができます。午前は0で、朝を示しています。 PMは1で、午後を示しています。
(フィールド10)パブリック最終静的int時間= 10;
説明:その日の時間を示します。
時間は12時間の時計(0-11)に使用されます。正午と真夜中は12ではなく0で表されます。
(フィールド11)パブリック最終静的int hour_of_day = 11;
説明:その日の時間を示します。
hour_of_dayは24時間のクロックに使用されます。たとえば、午後10:04:15.250 pmの時点で、hour_of_dayは22です。
(フィールド12)パブリック最終静的int分= 12;
説明:何時間時間ですか?
たとえば、10:04:15.250 pmの時点で、分は4です。
(フィールド13)パブリック最終静的int second = 13;
説明:1分に何度も。
たとえば、午後10:04:15.250 PMの時点で、2番目は15です。
(フィールド14)パブリック最終静的int millisecond = 14;
説明:1秒のミリ秒。
たとえば、午後10:04:15.250 PMの時点で、ミリ秒は250です。
(フィールド15)パブリック最終静的intゾーン_offset = 15;
注:ミリ秒は、GMTからのおおよそのオフセットを示しています。
(フィールド16)パブリック最終静的int dst_offset = 16;
説明:ミリ秒は、夏時間のオフセットを示しています。
public final static int field_count = 17;
これらの17のフィールドは、INTアレイに保存されます。定義は次のとおりです。
//これらの17のフィールドの配列を保存したINTフィールド[]; //配列定義関数保護カレンダー(TimeZone Zone、Locale Alocale){//「Fields Array」フィールドを初期化= new int [field_count]; Isset = new Boolean [field_count]; Stamp = new int [field_count]; this.zone = Zone; setWeekCountData(alocale);}保護されたカレンダー(タイムゾーンゾーン、ロケールアロケール)これはカレンダーのコンストラクターです。サブクラスコンストラクターによって呼び出されるため、「カレンダーの17個のフィールドデータを保存」の新しい配列が作成されます。
3。カレンダーカレンダー各フィールド値の計算
カレンダーの17のフィールドの計算と操作を簡単に説明するための例として(intフィールド)を取得しましょう。 get(intフィールド)は、「フィールド」フィールドの値を取得することです。その定義は次のとおりです。
public int get(int field){//各フィールドの値を計算します(); //フィールドフィールドの値を返すinternalget(フィールド);}注:GET(intフィールド)のコードは非常に簡単です。まず、完全な()を介して各フィールドの値を計算し、次に内部get(フィールド)を介して「フィールドフィールドの値」を返します。
Complete()の関数は、カレンダーの各フィールドの値を計算することです。それはcalendar.javaで定義されています、コードは次のとおりです。
protected void complete(){if(!istimeset)updateTime(); if(!arefieldsset ||!areallfieldsset){computefields(); //未解決のフィールドに入力しますareallfieldsset = arefieldsset = true; }} private void updateTime(){computeTime(); ISTIMESET = true;} updatetime()computetime()は、calendar.javaの実装クラスで定義されています。以下に、gregoriancalendar.javaでComputetime()の実装をリストします。 //チェックを通じて、フィールド値は元のフィールド[] //に保存され、それらのいずれかが後で正規化されるかどうかを確認します。 if(!islenient()){if(originalfields == null){originalfields = new int [field_count]; } for(int field = 0; field <field_count; field ++){int value = internalget(field); if(isexternallyset(field)){//範囲外値のクイック検証if(value <getminimum(field)|| value> getMaximum(field)){throw new Illegalargumentexception(getFieldName(field)); }} originalfields [field] = value; }} //スーパークラスに、//時間の計算に使用されるカレンダーフィールドを決定させます。 int fieldmask = selectfields(); //年はエポック開始にデフォルトです。 //年のフィールドマスクは、//日付を決定するための必須フィールドであるため、年間フィールドマスクをチェックしません。 int year = isset(year)? internalget(year):epoch_year; int era = internalgetera(); if(era == bce){year = 1 -year; } else if(era!= ce){//寛大なモードであっても、ce&bce以外の時代の値を禁止します。 //(add()/roll()と同じ正規化ルールは、ここでは寛大なモードで適用できます。ただし、このチェックは、1.5時点で互換性があるために//変更されていません。) } //年が0または負の場合、ERA値を後で設定する必要があります。 if(year <= 0 &&!isset(era)){fieldmask | = era_mask; setfieldscomputed(era_mask); } //時間を計算します。私たちは、//未解決のフィールドが0. long timeofday = 0を持っているという条約に依存しています。 if(isfieldset(fieldmask、hore_of_day)){timeofday +=(long)internalget(hour_of_day); } else {timeofday += internalget(hour); // AMを指定するAM_PMのデフォルト値は0です。 if(isfieldset(fieldmask、am_pm)){timeofday += 12 * internalget(am_pm); }} timeofday *= 60; Timeofday += internalget(minute); Timeofday *= 60; Timeofday += internalget(second); Timeofday *= 1000; Timeofday += internalget(millisecond); //時間の時間を日数に変換し、真夜中から//ミリ秒オフセットを変換します。 long sixeddate = timeofday / one_day; Timeofday%= one_day; while(timeofday <0){timeofday += one_day; - fixeddate; } // 1月1日以降の固定日を計算します(グレゴリオ)。 calucleatefixeddate:{long gfd、jfd; if(year> gregoriancutmeryear && year> gregoriancut everyalianjulian){gfd = fixeddate + getFixedDate(gcal、year、fieldmask); if(gfd> = gregoriancutoverdate){sixeddate = gfd; calculatedfixeddateを壊します。 } jfd = fixeddate + getFixedDate(getJulianCalendarSystem()、year、fieldmask); } else if(year <gregoriancut earear && year <gregoriancut eganyearjulian){jfd = fixtdate + getFixEdDate(getJulianCalendarsystem()、year、fieldmask); if(jfd <gregoriancutoverdate){sixeddate = jfd; calculatedfixeddateを壊します。 } gfd = fixeddate + getFixedDate(gcal、year、fieldmask); } else {gfd = fixeddate + getFixedDate(gcal、year、fieldmask); jfd = fixeddate + getFixedDate(getJulianCalendarsystem()、year、fieldmask); } //ここで、それがどのカレンダー日付であるかを決定する必要があります。 if(gfd> = gregoriancutoverdate){if(jfd> = gregoriancutoverdate){sixeddate = gfd; } else {//日付は「重複」期間です。そうでない//それを乱用する。 //前の日付計算を使用してそれを決定します。 if(calsys == gcal || calsys == null){sixeddate = gfd; } else {sixeddate = jfd; }}} else {if(jfd <gregoriancutoverdate){sixeddate = jfd; } else {//日付は「欠落」期間です。 if(!islenient()){新しいIllegalargumentException( "指定された日付は存在しない"); } //互換性のためにジュリアンの日付を取ります。 sixeddate = jfd; }}} // Millisは、Millisecondsで現地の壁1杯の時間を表します。 long millis =(sixtdate -epoch_offset) * one_day + timeofday; //タイムゾーンオフセットとDSTオフセットを計算します。ここには2つの潜在的な//あいまいさがあります。ここでは、ディスカッションの目的で、午前2時(壁の時間)スイッチオーバー時間を想定します。 //1。DSTへの移行。ここでは、午前2時から午前2時59分に設計された時間は、標準またはDSTに依存することができます。ただし、午前2時は無効な//表現です(表現は午前1時59分59時から午前3時から午前3時までジャンプします)。 //標準時間を想定しています。 //2。DSTからの遷移。ここでは、午前1時から午前1時59分に設計された時間が標準またはDSTになります。どちらも有効な表現です(rep // 1:59:59 dstから1:00:00 stdまでジャンプ)。 //繰り返しますが、標準時間を想定しています。 //ユーザーがゾーン_offset //またはdst_offsetフィールドを明示的に設定していない限り、timezoneオブジェクトを使用します。次に、それらのフィールドを使用します。 TimeZone Zone = getZone(); if(ゾーンオフセット== null){ゾーンオフセット= new int [2]; } int tzmask = fieldmask&(zone_offset_mask | dst_offset_mask); if(tzmask!=(ZONE_OFFSET_MASK | DST_OFFSET_MASK)){if(Zone InstanceOf ZONEINFO){((ZONEINFO)ZONE).GETOFFSETSBYWALL(MILLIS、ゾーンオフセット); } else {int gmtoffset = isfieldset(fieldmask、zone_offset)? internalget(ゾーン_offset):ゾーン.getRawoffset(); Zone.GetOffsets(Millis -GMToffset、ZoneOffsets); }} if(tzmask!= 0){if(isfieldset(tzmask、ゾーン_offset)){ゾーンオフセット[0] = internalget(ゾーン_offset); } if(isfieldset(tzmask、dst_offset)){ゾーンオフセット[1] = internalget(dst_offset); }} //タイムゾーンのオフセット値を調整して、UTC時間を取得します。 millis - =ゾーンオフセット[0] +ゾーンオフセット[1]; //このカレンダーの時間をMilliseconds time = millisで設定します。 int mask = computefields(fieldmask | getSetStateFields()、TZMASK); if(!islenient()){for(int field = 0; field <field_count; field ++){if(!isexternallyset(field)){continue; } if(originalfields [field]!= internalget(field)){//元のフィールド値system.arraycopy(originalfields、0、fields、0、fields.length);新しいIllegalargumentException(getFieldName(field)); }}} setfieldsnormalized(mask);}次に、internalget(フィールド)の定義を見てみましょう。次のように:
Protected final int internalget(int field){return fields [field];}このことから、Get(intフィールド)が最終的にInternalget(intフィールド)を介して値を返すことがわかります。
internalget(int field)は、実際にフィールドアレイのフィールド要素を返します。これは、カレンダーの17の要素に対応します!
要するに、私たちが理解する必要があるのは、カレンダーが「年、月、1日、秒、秒」などを計算することです。以下に、カレンダーで提供される関連する操作関数を以下に紹介します。
パート3カレンダー関数インターフェイス
1。17のカレンダーフィールドの共通インターフェイス
これらの17のカレンダーフィールドは、次のパブリック関数インターフェイスをサポートしています。これらの一般的なインターフェイスを使用する例については、CalendArtest.javaの例のtestallcalendaresections()関数を参照してください。
(1)getmaximum(int field)
関数:「フィールドの最大値」を取得します。注「それとgetActualMaximum()の違いを比較してください」。例:「月」フィールドに関して。それを使用する方法:
//カレンダーインスタンスを取得カレンダーcal = calendar.getInstance(); //月の最大値を取得int max = cal.getmaximum(calendar.month);
他のフィールドの最大値を取得するには、例の対応する月を他のフィールド名に置き換えるだけです。
(2)GetActualMaximum(int field)
関数:「現在の日付に基づくこのフィールドの最大値」を取得します。例:「月」フィールドに関して。それを使用する方法:
//カレンダーインスタンスを取得カレンダーcal = calendar.getInstance(); //現在の月の最大値を取得しますint max = cal.getactualmaximum(calendar.month);
他のフィールドの最大値を取得するには、例の対応する月を他のフィールド名に置き換えるだけです。
注:getActualMaximum()とgetMaximum()の違いを比較します。以下の比較例を参照してください。
A. getMaximum()によって取得された「フィールド最大値」は、結合されたすべての日付で得られた「フィールド最大値」を指します。
たとえば、getmaximum(calendar.date)の目的は、「「最大日」を取得する」ことです。すべての日付に基づいて、1か月あたり最大31日が得られます。したがって、getmaximum(calendar.date)の返品値は「31」です!
B. getActualMaximum()は、「現在の日付でこのフィールドの最大値」を取得します。
たとえば、日付が2013-09-01の場合、GetActualMaximum(Calendar.date)は「最大日」を取得し、「30」です。現在の日付は9月で、9月はわずか30日です。したがって、GetActualMaximum(Calendar.date)の返品値は「30」です!
(3)getminimum(int field)
関数:「フィールドの最小値」を取得します。注「それとgetActualMinimum()の違いを比較してください」。例:「月」フィールドに関して。それを使用する方法:
//カレンダーインスタンスを取得カレンダーcal = charend.getInstance(); //月の最小値を取得int min = cal.getminimum(charend.month);
他のフィールドの最小値を取得するには、例の対応する月を他のフィールド名に置き換えるだけです。
(4)GetActualMinimum(intフィールド)
関数:「現在の日付に基づくこのフィールドの最小値」を取得します。例:「月」フィールドに関して。使用方法://カレンダーインスタンスカレンダーcal = callarend.getInstance(); //月の最小値を取得int min = cal.getminimum(charend.month);
他のフィールドの最小値を取得するには、例の対応する月を他のフィールド名に置き換えるだけです。
注:Javaのデフォルトカレンダーでは、getMinimum()およびgetActualMinimum()には異なる意味があります。ただし、リターン値は同じです。カレンダーのデフォルトは、GregorianCalendar.java、getMinimum()、およびgetActualMinimum()でGregorianCalendarオブジェクトを返すことであるため、同じ値を返します。
(5)get(intフィールド)
関数:「フィールドの現在の値」を取得します。フィールドフィールドの現在の値を取得します。例:「月」フィールドに関して。 「月の現在の値を取得する」方法は次のとおりです。
//カレンダーインスタンスを取得カレンダーcal = calendar.getInstance(); //「cal calendary」int month = cal.get(calendar.month)の現在の月値を取得します。
他のフィールドの現在の値を取得するには、例の対応する月を他のフィールド名に置き換えるだけです。
(6)set(int field、int value)
関数:「フィールドの現在の値」を設定します。フィールドフィールドの現在の値を値に設定します。例:「月」フィールドの観点から。 「月の現在の値を設定する」方法は次のとおりです。
//カレンダーインスタンスカレンダーcal = calendar.getInstance(); //「Calカレンダー」の現在の月値を1988 Cal.Set(Calendar.Month、1988)に設定します。
説明:
A. 1988は、設定したい月の現在の価値です。この設定値は整数でなければなりません。
B.他のフィールドの現在の値を設定するには、例の対応する月を他のフィールド名に置き換える必要があります。
(7)add(int field、int value)
関数:「フィールドの現在の値」に値を追加します。フィールドフィールドの現在の値に値を追加します。例:「月」フィールドに関して。この方法は次のとおりです。
//カレンダーインスタンスを取得して、日付を「2013-09-01」カレンダーCal = Callearn.getInstance(); cal.set(calendar.year、2013); cal.set(calendar.month、8); cal.set(calendar.date、1); // add -10 "cal.add(calendar.month、-10);
説明:
A. -10は付加値です。
付加価値は、正または負の数になります。
正の数は、日付が増加することを示し、負の数は日付が減少していることを示します。
仮定:Calの値は「2013-09-01」になりましたが、今ではフィールド値-10を増やします。その結果、「2012-10-01」。
なぜこれが起こっているのですか? 「2013-09-01」は-10増加します。これは、日付を10か月削減することを意味します。結果は「2012-10-01」です。
B.カレンダーの17のフィールドのうち、カレンダーをロールバックすることを除き、zone_offsetを除き、Illegalargumentexceptionの例外がスローされます。他のフィールドはこの操作をサポートしています。
C.他のフィールドの現在の値を設定するには、例の対応する月を他のフィールド名に置き換えるだけです。
(8)ロール(intフィールド、int値)
関数:「フィールドの現在の値」をロールバックします。例:「月」フィールドを取ります。 「月の現在の値をロールバックする」方法は次のとおりです。
//カレンダーインスタンスを取得し、日付を「2013-09-01」カレンダーCal = Callearn.getInstance(); Cal.set(Calendar.year、2013); Cal.set(Calendar.Month、8); Cal.set(Calendar.date、1);
説明:
A. -10はロールバック値です。
ロールバック値が負の数である場合、現在のフィールドを前方に転がすことを意味します。
ロールバック値が正の数である場合、それは現在のフィールドを後方に転がすことを意味します。
カレンダーでフィールドをロールバックするときは、より大きなフィールドを変更しないでください!
これは、roll()とadd()の基礎の違いです! add()は、「add()を使用して「月」フィールドを変更するなど、より大きなフィールドを変更する場合があります。「年」フィールドに変更を引き起こす可能性があります。ただし、roll()は、「ロール()を使用して「月」フィールドを変更するなど、より大きなフィールドを変更しません。「年」フィールドに変更が生じません。」
仮定:Calの値は「2013-09-01」になりましたが、今ではフィールド値-10を増やします。その結果、「2013-10-01」。
なぜこれが起こっているのですか?これは、「ロールバック」が「最小値と最大値の間を前後に転がる」ことを意味するためです。この例では、月は9月で、以前のロールバックは10で、得られた値は10月ですが、ロール()は「月よりも大きい」フィールドを変更しないため、年度は変わりません。結果は「2013-10-01」です。
B.カレンダーの17のフィールドのうち、カレンダーをロールバックすることを除き、zone_offsetを除き、Illegalargumentexceptionの例外がスローされます。他のフィールドはこの操作をサポートしています。
C.他のフィールドの現在の値を設定するには、例の対応する月を他のフィールド名に置き換えるだけです。
(9)clear(int field)
関数:「フィールドの現在の値」をクリアします。いわゆるクリアリングは、実際に「フィールド」の値を0に設定します。フィールドの最小値が1の場合、それは1に設定されます。例:「月」フィールドに関して。 「明確な月」の方法は次のとおりです。
//カレンダーインスタンスを取得し、日付を「9月」に設定しますcallearn.getInstance(); cal.set(calendar.month、9); // clear monthcal.clear(calendar.month);
他のフィールドをクリアするには、例の対応する月を他のフィールド名に置き換えるだけです。
(10)Isset(intフィールド)
関数:「フィールドフィールド」が設定されているかどうかを判断します。 Clear()が呼び出された場合、フィールドは「セット状態なし」になります。例:「月」フィールドに関して。 「月が設定されているかどうかを判断する」方法は次のとおりです。
//カレンダーインスタンスを取得カレンダーcal = callarend.getInstance(); //月が設定されているかどうかを判断します。
他のフィールドを決定するには、例の対応する月を他のフィールド名に置き換えるだけです。
2。カレンダーのその他の機能
(1)日付比較関数
カレンダーの比較関数には、主に以下が含まれます。
//「現在のカレンダーオブジェクト」と「カレンダー」の日付、タイムゾーン、およびその他のコンテンツが等しいかどうかを比較します。 Booleanは(オブジェクトオブジェクト)//現在のカレンダーオブジェクトが(オブジェクトカレンダー)より前のカレンダーブールよりも早いかどうか// //「カレンダー」よりも早い場合は-1 //等しい場合、「カレンダー」よりも遅れて0 //を返します。
これらの関数を使用する例については、CalendArtest.javaの例のtestComparatorApis()関数を参照してください。
例:Cal1とCal2が両方ともカレンダーの2つのオブジェクトであると仮定します。
//それらの使用方法は次のとおりです。Booleanisequal= cal1.equals(cal2); boolean isfore = cal1.before(cal2); boolean isafter = cal1.after(cal2); int icompare = cal1.compareto(cal2);
(2)「耐性」関数
//「カレンダー許容範囲」void setlenient(boolean value)//「カレンダー許容」を取得するboolean islenient()
これらの関数を使用する例については、CalendArtest.javaの例のtestlenientapis()関数を参照してください。
説明:
カレンダーには、カレンダーフィールドを解釈する2つのモード、すなわち、寛大で非寛容です。
A.カレンダーが寛大なモードの場合、生成するカレンダーフィールドの範囲よりも大きい範囲内の値を受け入れることができます。カレンダーがカレンダーフィールド値を再計算して、これらの値がget()によって返されるようにすると、すべてのカレンダーフィールドが正規化されます。
たとえば、寛大なモードのグレゴリアンカレンダーは月== 1月、day_of_month == 32 2月1日に相互に解釈します。
B.カレンダーが非依存モードの場合、カレンダーフィールドに矛盾がある場合、例外がスローされます。
たとえば、GregorianCalendarは、1か月の長さの間で常にday_of_month値を生成します。範囲外のフィールド値が設定されている場合、時間またはカレンダーのフィールド値を計算するときに、非依存モードのグレゴリアンカレンダーが例外をスローします。
注:ステップ(02)の例外は、set()を使用する場合はスローされませんが、get()、gettimeinmillis()、gettime()、add()、roll()などの関数でのみスローされます。 set()は変更フラグを設定するだけで、get()などのメソッドは時間の再計算を引き起こし、この時点で例外がスローされます!
(3)「年、月、日、タイムゾーン、ミリ秒関数
//「年、月、日」、最終voidセット(int year、month、day、time、time、time int decond)// "year、month、day、time、time、int int int int int int int)を設定します。カレンダータイムゾーンに対応するgettimezone()//カレンダーvoid setimezone(timezone timezone)に対応するタイムゾーンを設定//カレンダーに対応するミリコンデス値を取得します。ミリ秒)
これらの関数を使用する例については、CalendArtest.javaの例のtesttimeapis()関数を参照してください。
(4)その他の操作
// clone calendarobject clone()//「曜日は週の最初の日です」を取得します。たとえば、米国では、この日は日曜日であり、フランスでは、この日は月曜日です。 int getFirstDayOfWeek()//「曜日は何日かは週の初日です」を設定します。たとえば、米国では、この日は日曜日であり、フランスでは、この日は月曜日です。 void setfirstdayofweek(int value)//は、年の最初の週に必要な最低日数を取得します。たとえば、最初の週に年の最初の月の最初の日が含まれている場合、この方法は1を返します。最小日数が1週間でなければならない場合、この方法は7。intgetMinimaldaysInfirstweek()//は、最初の週に最低月の1つの方法が含まれている場合、最初の1週間の場合、最初の1週間が含まれている場合、1年目の最初の1日の場合、1年の最初の週に必要な最低日数を設定します。週、この方法は7の値で呼び出されます。
これらの関数を使用する例については、CandalESTEST.javaの例のtestotherapis()関数を参照してください。
パート4カレンダーの使用例
以下では、例を介してカレンダーを使用してAPIを学びます。 CalendArtest.javaのソースコードは次のとおりです。
Import java.util.date; Import java.util.calendar; Import java.util.timezone; Import java.util.random; public class calendArtest {public static void main(string [] args){// 17のフィールドを持つカレンダーの「パブリック関数インターフェース」 "testallcalendections(); //カレンダーの「比較インターフェイス」TestComparatorApis(); //カレンダーの「比較インターフェイス」testlenientapis()をテストします。 //カレンダーの日付、タイムゾーン、ミリ秒、およびその他の関連する関数をテストするtesttimeapis(); //カレンダーのclone()、getFirstDayOfWeek()、およびその他のインターフェイスtestotherapis(); } /** *テスト「カレンダーのフィールド」 * * @param cal-カレンダーオブジェクト * @paramフィールド - 「カレンダーフィールド」をテストします。次の値にすることができます: * calendar.year、calendar.month、calendar.date、... etc * @paramタイトル - タイトル */ private static void testSection(calendary cal、int field、string title){final random = new Random();最終日付= cal.getTime(); final int min = cal.getminimum(field); //「フィールド最小値」を取得しますfinal int max = cal.getmaximum(field); //「フィールド最大値」を取得しますfinal int eractmin = cal.getactualminimum(field); //「現在の日付に基づくフィールドの最小値」を取得しますfinal int eractmax = cal.getactualmaximum(field); //「現在の日付に基づくフィールドの最大値」を取得//「フィールドの現在の値を取得します」final int ori = cal.get(フィールド); //「フィールドの現在の値」を設定し、「final int r1 = random.nextint(max)を設定した後に「値」を取得します。 Cal.Set(Field、R1); final int set = cal.get(field); {//「フィールドの現在の値」をロールバックしてください:「フィールドの最小値」と「フィールドの最大値」の間にロールバックします。 //「ローラー値」は正または負になる可能性があります。 cal.roll(field、-max); } catch(IllegalargumentException e){// field == calendar.zone_offsetの場合、例外がスローされます! e.printstacktrace(); } final int roll = cal.get(field); //ランダム値を取得します最終int sign =(random.nextint(2)== 1)? 1:-1; final int r2 = sign * random.nextint(max); {//「フィールドの現在の値」を追加し、「新しい現在のフィールド値」を取得する// addの「パラメーター値」を取得します。 Cal.Add(Field、R2); } catch(IllegalargumentException e){// field == calendar.zone_offsetの場合、例外がスローされます! e.printstacktrace(); } final int add = cal.get(field); //フィールド情報System.out.printfを印刷すると、 "%s:/n/trang is [%d -%d] areationrange is [%d -%d]。元の=%d、set(%d)=%d、roll(%d)=%d、add(%d)=%d/n" } / ** *カレンダーの「17のフィールドとのパブリック関数インターフェイス」 * / private static void testallcalendAresections(){//00。ERAフィールドテストセクション(Calendar.getInstance()、Calendar.era、 "Calendar.era"); // 01。年のフィールドテストセクション(calendar.getInstance()、calendar.year、 "calendar.year"); // 02。月のフィールドテスト(Calendar.getInstance()、Calendar.Month、 "calendar.month"); //03。WEEK_OF_YEARFIELD TESTSECTION(Calendar.getInstance()、Calendar.week_of_year、 "calendar.week_of_year"); //04。WEEK_OF_MONTHFIELD TESTSECTION(Calendar.getInstance()、Calendar.week_of_month、 "calendar.week_of_month"); // 05。日付フィールドテストセクション(calendar.getInstance()、calendar.date、 "calendar.date"); //06。day_of_monthフィールドテストセクション(calendar.getInstance()、calendar.day_of_month、 "calendar.day_of_month"); //07。day_of_yearフィールドテストセクション(calendar.getInstance()、calendar.day_of_year、 "calendar.day_of_year"); // 08. DAY_OF_WEEK field testSection(Calendar.getInstance(), Calendar.DAY_OF_WEEK, "Calendar.DAY_OF_WEEK"); // 09. DAY_OF_WEEK_IN_MONTH field testSection(Calendar.getInstance(), Calendar.DAY_OF_WEEK_IN_MONTH, "Calendar.DAY_OF_WEEK_IN_MONTH"); // 10. AM_PM field testSection(Calendar.getInstance(), Calendar.AM_PM, "Calendar.AM_PM"); // 11. HOUR field testSection(Calendar.getInstance(), Calendar.HOUR, "Calendar.HOUR"); // 12. HOUR_OF_DAY field testSection(Calendar.getInstance(), Calendar.HOUR_OF_DAY, "Calendar.HOUR_OF_DAY"); // 13. MINUTE field testSection(Calendar.getInstance(), Calendar.MINUTE, "Calendar.MINUTE"); // 14. SECOND field testSection(Calendar.getInstance(), Calendar.SECOND, "Calendar.SECOND"); // 15. MILLISECOND Field testSection(Calendar.getInstance(), Calendar.MILLISECOND, "Calendar.MILLISECOND"); // 16. ZONE_OFFSET Field testSection(Calendar.getInstance(), Calendar.ZONE_OFFSET, "Calendar.ZONE_OFFSET"); } /** * Test Calendar's "Compare Interface" */ private static void testComparatorAPIs() { // Create new cal1, and the time was 1988 Calendar cal1 = Calendar.getInstance(); cal1.set(Calendar.YEAR, 1988); // Create cal2, and the time is 2000 Calendar cal2 = Calendar.getInstance(); cal2.set(Calendar.YEAR, 2000); // Create cal3, which is a cloned object of cal111 Calendar cal3 = (Calendar)cal1.clone(); // equals determine whether the contents of "time, time zone, etc." of cal1 and cal2 are equal boolean isEqual12 = cal1.equals(cal2); // equals determine whether the contents of "time, time zone, etc." of cal1 and cal3 are equal boolean isEqual13 = cal1.equals(cal3); // Is cal1 boolean earlier than cal2 isBefore = cal1.before(cal2); // Is cal1 later than cal2 boolean isAfter = cal1.after(cal2); // Compare cal1 and cal2 // (01) If cal1 is earlier than cal2, return -1 // (02) If cal1 is equal to cal2, return 0 // (03) If cal1 is later than cal2, return 1 int icompare = cal1.compareTo(cal2); System.out.printf("/ntestComparatorAPIs: isEuqal12=%s, isEqual13=%s, isBefore=%s, isAfter=%s, icompare=%s/n", isEqual12, isEqual13, isBefore, isAfter, icompare); } /** * Test Calendar's "Compare Interface" */ private static void testLenientAPIs() { Calendar cal = Calendar.getInstance(); // Get the default "tolerance". Return true boolean oriLenient = cal.isLenient(); // The MONTH value can only be "0-11", and the bounds are exceeded here. However, since cal is currently tolerant, the exception cal.set(Calendar.MONTH, 50); // Set "tolerance" to false. cal.setLenient(false); // Get the set "tolerance" boolean curLenient = cal.isLenient(); try { // The MONTH value can only be "0-11", and the bounds are exceeded here. Moreover, cal is currently intolerant, so an exception will occur. // However, the exception will not be thrown until the next time the date is calculated. That is, the exception is not thrown back in set(), but the exception is not thrown until get() is cal.set(Calendar.MONTH, 50); // At this time, read cal. Reading will cause the value of cal to be recalculated, so an exception is thrown at this time! int m2 = cal.get(Calendar.MONTH); } catch (IllegalArgumentException e) { e.printStackTrace(); } System.out.printf("/ntestLenientAPIs: oriLenient=%s, curLenient=%s/n", oriLenient, curLenient); } /** * Test Calendar's Date, TimeZone, MilliSecond and other related functions*/ private static void testTimeAPIs() { Calendar cal = Calendar.getInstance(); // Set the time zone of cal to "GMT+8" cal.setTimeZone(TimeZone.getTimeZone("GMT+8")); // Get the current cal time zone TimeZone timezone = cal.getTimeZone(); // Set milliseconds cal.setTimeInMillis(1279419645742l); // Get milliseconds long millis = cal.getTimeInMillis(); // After setting milliseconds, the time also changed. // Get the date corresponding to cal Date date = cal.getTime(); // Set the time to "1988-08-08" cal.set(1988, 08, 08); // Set the time to "1999-09-09 09:09" cal.set(1999, 09, 09, 9, 9); // Set the time to "2000-10-10 10:10:10" cal.set(2000, 10, 10, 10, 10, 10); System.out.printf("/ntestTimeAPIs: date=%s, timezone=%s, millis=%s/n", date, timezone, millis); } /** * Test Calendar's clone(), getFirstDayOfWeek() and other interfaces*/ private static void testOtherAPIs() { Calendar cal = Calendar.getInstance(); //Clone cal Calendar clone = (Calendar)cal.clone(); // Set to 2013-01-10. // Note: 2013-01-01 is "Tuesday", 2013-01-06 is "Sunday", clone.set(Calendar.YEAR, 2013); clone.set(Calendar.MONTH, 0); clone.set(Calendar.DATE, 10); // Set "The first week of this year contains at least 1 day". // Then 2013-01-10 belongs to the second week clone.setMinimalDaysInFirstWeek(1); int m1 = clone.getMinimalDaysInFirstWeek(); int index1 = clone.get(Calendar.WEEK_OF_YEAR); // Set "The first week of this year contains at least 7 days". // Then 2013-01-10 belongs to the first week clone.setMinimalDaysInFirstWeek(7); int m2 = clone.getMinimalDaysInFirstWeek(); int index2 = clone.get(Calendar.WEEK_OF_YEAR); // Set "What day of the week is the first day of the week". clone.setFirstDayOfWeek(Calendar.WEDNESDAY); // Get "What day of the week is the first day of the week". int firstdayOfWeek = clone.getFirstDayOfWeek(); System.out.printf("/ntestOtherAPIs: firstdayOfWeek=%s, [minimalDay, WeekOfYear]={(%s, %s), (%s, %s)} %s/n", firstdayOfWeek, m1, index1, m2, index2, clone.getTime()); }}第五部分自定义的Calendar接口示例
这些接口在写日历程序时可能会用到。
源代码如下(CalendarSelfDefineTest.java):
import java.util.Calendar;/** * Some commonly used functions encapsulated according to Calendar's API*/public class CalendarSelfDefineTest { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); // Set the date to "2013-09-18" cal.set(2013, Calendar.SEPTEMBER, 18); // Get "year" System.out.printf("year: %s/n", getYear(cal) ); // Get "month" System.out.printf("month: %s/n", getMonth(cal) ); // Get "Last Month" System.out.printf("previcou month: %s/n", getLastMonth(cal) ); // Get "Next Month" System.out.printf("next month: %s/n", getNextMonth(cal) ); // Get "Day" System.out.printf("day: %s/n", getDay(cal) ); // Get Cal's corresponding weekly date System.out.printf("weekday: %s/n", getWeekDay(cal) ); // Number of days this month System.out.printf("Current Month days: %s/n", getMonthDays(cal) ); // Number of days last month System.out.printf("Previcous Month days: %s/n", getPrevMonthDays(cal) ); // Number of days next month System.out.printf("Next Month days: %s/n", getNextMonthDays(cal) ); // Get the day of the week of the first day of the month System.out.printf("First day' weekday: %s/n", getFirstDayWeekday(cal) ); // Get the day of the week of the first day of the month System.out.printf("First day' weekday: %s/n", getFirstDayWeekday(cal) ); // Get the week of the last day of the current month System.out.printf("Last day' weekday : %s/n", getLastDayWeekday(cal) ); // Get the week of the last day of the previous month System.out.printf("PrevMonth Last day' weekday: %s/n", getLastDayWeekdayOfPrevMonth(cal) ); // Get the week of the first day of the next month System.out.printf("NextMonth First day' weekday: %s/n", getFirstDayWeekdayOfNextMonth(cal) ); } /** * Get "year" * * @return For example, 2013-09-18, it returns 2013 */ public static int getYear(Calendar cal) { return cal.get(Calendar.YEAR); } /** * Get "month" * * @return The return value can be the following values: * JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER. * The first month of which is JANUARY, which is 0. * * For example, 2013-09-18, return 8 */ public static int getMonth(Calendar cal) { return cal.get(Calendar.MONTH); } /** * Get "Last month" * * @return The return value can be the following values: * JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER. * The first month of which is JANUARY, which is 0. * * For example, the last month of 2012-01-12 was "11" (i.e. DECEMBER). */ public static int getLastMonth(Calendar cal) { return (cal.get(Calendar.MONTH) + 11) % 12; } /** * Get "Next Month" * * @return The return value can be the following values: * JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER. * The first month of which is JANUARY, which is 0. * * For example, the next month on 2013-12-12 is "1" (i.e. DECEMBER). */ public static int getNextMonth(Calendar cal) { return (cal.get(Calendar.MONTH) + 13) % 12; } /** * Get "day" * * @return For example, 2013-09-18, it returns 18 * */ public static int getDay(Calendar cal) { return cal.get(Calendar.DATE); } /** * Get "days of this month" * * @return For example, 2013-09-18, it returns 30 * */ public static int getMonthDays(Calendar cal) { return cal.getActualMaximum(Calendar.DATE); } /** * Get "days in the previous month" * * @return For example, 2013-01-18, it returns 31 (because there are 31 days in 2012-12) * */ public static int getPrevMonthDays(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, cal tmpCal.add(Calendar.MONTH, -1); // Set to "Last month" return tmpCal.getActualMaximum(Calendar.DATE); } /** * Get "Number of days in the next month" * * @return For example, 2013-12-18, it returns 31 (because there are 31 days in 2014-01) * */ public static int getNextMonthDays(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.add(Calendar.MONTH, 1); // Set to "Next Month" return tmpCal.getActualMaximum(Calendar.DATE); } /** * Get the corresponding day of the week of Cal* * @return Return to "day of the week", which can be the following values: * SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY and SATURDAY. * SUNDAY is 1, MONDAY is 2, and so on. * For example, 2013-09-18 (Wednesday), return 4 */ public static int getWeekDay(Calendar cal) { return cal.get(Calendar.DAY_OF_WEEK); } /** * Get the corresponding day of the week on the first day of the month* * @return SUNDAY is 1, MONDAY is 2, and so on. */ public static int getFirstDayWeekday(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.set(Calendar.DATE, 1); // Set the date to the first day of the month return tmpCal.get(Calendar.DAY_OF_WEEK); } /** * Get the corresponding week day of the week on the last day of the current month* * @return SUNDAY is 1, MONDAY is 2, and so on. */ public static int getLastDayWeekday(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.set(Calendar.DATE, 1); // Set the date to the first day of the month tmpCal.roll(Calendar.DATE, -1); // Set the date to the last day of the month return tmpCal.get(Calendar.DAY_OF_WEEK); } /** * Get the week of the last day of the previous month* * @return SUNDAY is 1, MONDAY is 2, and so on. */ public static int getLastDayWeekdayOfPrevMonth(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.set(Calendar.DATE, 1); // Set the date to the first day of the month tmpCal.add(Calendar.DATE, -1); // Set the date to the last day of the previous month return tmpCal.get(Calendar.DAY_OF_WEEK); } /** * Get the week offset of the first day of the next month* * @return SUNDAY is 1, MONDAY is 2, and so on. */ public static int getFirstDayWeekdayOfNextMonth(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.add(Calendar.MONTH, 1); // Set to "Next Month" tmpCal.set(Calendar.DATE, 1); // Set to "First Day" return tmpCal.get(Calendar.DAY_OF_WEEK); }}