|
|
クラスライブラリの利用 (Calendar クラス) |
H.Kamifuji . |
日時などに関する情報を取得するためのCalendarクラスについて見ていきます。 クラス定義は下記のようになっています。 java.lang.Object | +-- java.util.Calendar public abstract class Calendar extends Object implements Serializable, Cloneable, Comparable使用する場合は「import java.util.Calendar;」を行って下さい。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
Calendarクラスはabstractクラスのため、直接new演算子でオブジェクトを作成することは出来ませんが、「getInstance」メソッドを使うことでオブジェクト作成することが出来るようになっています。 getInstance public static Calendar getInstance()デフォルトのタイムゾーンとロケールを使用してカレンダを取得します。返された Calendar は、デフォルトロケールを持つデフォルトタイムゾーンの現在時刻に基づいています。 戻り値: Calendar このメソッドを使って取得したCalendarクラスのオブジェクトはデフォルトの値としてこのメソッドが実行された時の日時の情報を取得しています。作成されたオブジェクトから日付情報などを取得できます。また、「getInstance」メソッドはstaticメソッドのため、「Calendar.getInstance()」のように利用します。 Calendar calendar = Calendar.getInstance(); |
年月日や時刻などの情報をCalendarオブジェクトから取得する方法を見ていきます。 get public int get(int field)指定されたカレンダフィールドの値を返します。非厳密モードでは、すべてのカレンダフィールドが正規化されます。厳密モードでは、すべてのカレンダフィールドが検証され、カレンダフィールドが範囲外の値を保持する場合にはこのメソッドにより例外がスローされます。正規化および検証は、complete() メソッドにより処理されます。この処理は、カレンダシステムにより異なります。 パラメータ: field - 指定されたカレンダフィールド 戻り値: 指定されたカレンダフィールドの値 例外: ArrayIndexOutOfBoundsException - 指定されたフィールドが範囲外の場合 (field < 0 || field >= FIELD_COUNT) 引数に指定できるカレンダーフィールドの値は下記の通りです。
上記は全て「static int」型として定義されており、例えば「get(Calendar.MINUTE)」とすることで、設定されている時刻の「分」に関する値を取得することができます。 基本的に各値が取り得る値は「1」から開始されますが、MONTHに関しては最初の値(つまり1月)は「0」から開始されるので注意して下さい。個々のフィールドに関しての細く説明は下記の通りです。 MONTHこのフィールドの値は0から11で、JANUARY(0), FEBRUARY(1), MARCH(2), APRIL(3), MAY(4), JUNE(5), JULY(6), AUGUST(7), SEPTEMBER(8), OCTOBER(9), NOVEMBER(10), DECEMBER(11)になります。HOURHOUR は 12 時間制 (0 〜 11) です。正午および真夜中は、12 ではなく 0 で表されます。DAY_OF_WEEKこのフィールドの値は1から7で、SUNDAY(1)、MONDAY(2)、TUESDAY(3)、WEDNESDAY(4)、THURSDAY(5)、FRIDAY(6)、および SATURDAY(7) になります。AM_PMこのフィールドの値は0か1で、AM(0)、PMY(1) になります。では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.util.Calendar; class testCalendar1{ public static void main(String args[]){ String[] week_name = {"日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"}; Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH) + 1; int day = calendar.get(Calendar.DATE); int hour = calendar.get(Calendar.HOUR_OF_DAY); int minute = calendar.get(Calendar.MINUTE); int second = calendar.get(Calendar.SECOND); int week = calendar.get(Calendar.DAY_OF_WEEK) - 1; int day_of_year = calendar.get(Calendar.DAY_OF_YEAR); System.out.println("現在の日時は"); System.out.println(year + "年" + month + "月" + day + "日"); System.out.println("(" + week_name[week] + ")"); System.out.println(hour + "時" + minute + "分" + second + "秒"); System.out.println("今日は今年の" + day_of_year + "日目です"); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Calendar]$ javac testCalendar1.java [xxxxxxxx@dddddddddd Calendar]$ java testCalendar1 現在の日時は 2017年2月3日 (金曜日) 14時24分37秒 今日は今年の34日目です [xxxxxxxx@dddddddddd Calendar]$ |
Calendarクラスのオブジェクトが持っている日時に関する値を変更します。使用方法の異なる4つの「set」メソッドがあります。 1番目のメソッドは、カレンダーフィールドを指定して、そのフィールドに対する値を設定します。 set public void set(int field, int value)指定されたカレンダフィールドを指定された値に設定します。モードが厳密/非厳密であるかに関係なく、このメソッドが値を解釈することはありません。 パラメータ: field - 指定されたカレンダフィールド value - 指定されたカレンダフィールドに設定する値 例外: ArrayIndexOutOfBoundsException - 厳密性モードで、指定されたフィールドが範囲外の場合 (field < 0 || field >= FIELD_COUNT) 例えば「Calendar.YEAR」というフィールドに対して「2006」という値をセットするといった感じです。(カレンダーフィールドに関しては「日時に関する情報を取得する(get)」を参照して下さい。 Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, 2006);※上記メソッド内で書かれている厳密か非厳密かのモードに関しては、厳密の場合は「2006/5/32」のような存在しない日付を使うと例外が発生します。非厳密の場合は「2006/5/32」は「206/5/1」の「31日後」と判断され「2005/6/1」と解釈されます。デフォルトでは非厳密になっています。 2番目のメソッドは、年月日の値を指定して、そのフィールドに対する値を設定します。 set public final void set(int year, int month, int date)カレンダフィールド YEAR、MONTH、および DAY_OF_MONTH の値を設定します。他のカレンダフィールドの以前の値は保持されます。保持されないようにする場合は、最初に clear() を呼び出します。 パラメータ: year - YEAR カレンダフィールドの設定に使用する値 month - MONTH カレンダフィールドの設定に使用する値。Month 値は 0 から始まる (1 月 は 0 になる) date - DAY_OF_MONTH カレンダフィールドの設定に使用する値 上記メソッドでは年月日以外の値は、メソッドが実行される前の値が残っている点を注意して下さい(例えば分や秒などです)。 Calendar calendar = Calendar.getInstance(); calendar.set(2006, 4, 14);3番目のメソッドは、年月日及び時間と分の値を指定して、そのフィールドに対する値を設定します。 set public final void set(int year, int month, int date, int hourOfDay, int minute)カレンダフィールド YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY、およびMINUTE の値を設定します。他のフィールドの以前の値は保持されます。保持されないようにする場合は、最初に clear() を呼び出します。 パラメータ: year - YEAR カレンダフィールドの設定に使用する値 month - MONTH カレンダフィールドの設定に使用する値。Month 値は 0 から始まる (1 月 は 0 になる) date - DAY_OF_MONTH カレンダフィールドの設定に使用する値 hourOfDay - HOUR_OF_DAY カレンダフィールドの設定に使用する値 minute - MINUTE カレンダフィールドの設定に使用する値 上記メソッドでは設定対象以外の値は、メソッドが実行される前の値が残っている点を注意して下さい(例えば秒などです)。 Calendar calendar = Calendar.getInstance(); calendar.set(2006, 4, 14, 9, 24);4番目のメソッドは、年月日及び時間、分、秒の値を指定して、そのフィールドに対する値を設定します。 set public final void set(int year, int month, int date, int hourOfDay, int minute, int second)フィールド YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE、および SECOND の値を設定します。他のフィールドの以前の値は保持されます。保持されないようにする場合は、最初に clear() を呼び出します。 パラメータ: year - YEAR カレンダフィールドの設定に使用する値 month - MONTH カレンダフィールドの設定に使用する値。Month 値は 0 から始まる (1 月 は 0 になる) date - DAY_OF_MONTH カレンダフィールドの設定に使用する値 hourOfDay - HOUR_OF_DAY カレンダフィールドの設定に使用する値 minute - MINUTE カレンダフィールドの設定に使用する値 second - SECOND カレンダフィールドの設定に使用する値 実際の使い方は下記のようになります。 Calendar calendar = Calendar.getInstance(); calendar.set(2006, 4, 14, 9, 24, 32);では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.util.Calendar; class testCalendar2{ public static void main(String args[]){ Calendar calendar = Calendar.getInstance(); System.out.println("現在の日時を設定します"); dispCalendar(calendar); System.out.println("-- -- -- -- -- --"); calendar.set(Calendar.YEAR, 2005); System.out.println("年を2005年に設定します"); dispCalendar(calendar); System.out.println("-- -- -- -- -- --"); calendar.set(2005, 10, 25); System.out.println("年月日を2005年11月25日に設定します"); dispCalendar(calendar); System.out.println("-- -- -- -- -- --"); calendar.set(2005, 10, 25, 14, 18); System.out.println("日時を2005年11月25日14時18分に設定します"); dispCalendar(calendar); } private static void dispCalendar(Calendar calendar){ String[] week_name = {"日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"}; int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH) + 1; int day = calendar.get(Calendar.DATE); int hour = calendar.get(Calendar.HOUR_OF_DAY); int minute = calendar.get(Calendar.MINUTE); int second = calendar.get(Calendar.SECOND); int week = calendar.get(Calendar.DAY_OF_WEEK) - 1; System.out.println("設定されている日時は"); System.out.println(year + "年" + month + "月" + day + "日"); System.out.println("(" + week_name[week] + ")"); System.out.println(hour + "時" + minute + "分" + second + "秒"); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Calendar]$ javac testCalendar2.java [xxxxxxxx@dddddddddd Calendar]$ java testCalendar2 現在の日時を設定します 設定されている日時は 2017年2月3日 (金曜日) 15時29分52秒 -- -- -- -- -- -- 年を2005年に設定します 設定されている日時は 2005年2月3日 (木曜日) 15時29分52秒 -- -- -- -- -- -- 年月日を2005年11月25日に設定します 設定されている日時は 2005年11月25日 (金曜日) 15時29分52秒 -- -- -- -- -- -- 日時を2005年11月25日14時18分に設定します 設定されている日時は 2005年11月25日 (金曜日) 14時18分52秒 [xxxxxxxx@dddddddddd Calendar]$ |
Calendarクラスのオブジェクトが持っている日時に関する値に対して、カレンダーフィールドを指定してそのフィールドの値を指定した値だけ加算/減算させます。 add public abstract void add(int field, int amount)カレンダの規則に基づいて、指定された時間量を指定されたカレンダフィールドに加算または減算します。たとえば、カレンダの現在時刻から 5 日を引く場合は、次の呼び出しを実行します。 add(Calendar.DAY_OF_MONTH, -5) パラメータ: field - カレンダフィールド amount - フィールドに追加される日付または時刻の量 例えば日を1ずつ増加させていき、その月の最後の日になりさらに追加すると月が1増加され日は1に戻ります。ただ注意する点としては日が31日などの場合に月を1だけ増加させた場合、増加後の月が30日までしか無い場合などは日も30に変更されます。その後に31日まである月になったとしても日は30日のままです。 では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.util.Calendar; class testCalendar3{ public static void main(String args[]){ Calendar calendar = Calendar.getInstance(); System.out.println("日時を2005/12/30に設定します"); calendar.set(2005, 11, 30); dispCalendar(calendar); System.out.println("-- -- -- -- -- --"); System.out.println("日を1ずつ増加させます"); for (int i = 0 ; i < 6 ; i++){ calendar.add(Calendar.DAY_OF_MONTH, 1); dispCalendar(calendar); } System.out.println("-- -- -- -- -- --"); System.out.println("日時を2006/1/31に設定します"); calendar.set(2006, 0, 31); dispCalendar(calendar); System.out.println("-- -- -- -- -- --"); System.out.println("月を1ずつ増加させます"); for (int i = 0 ; i < 4 ; i++){ calendar.add(Calendar.MONTH, 1); dispCalendar(calendar); } } private static void dispCalendar(Calendar calendar){ int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH) + 1; int day = calendar.get(Calendar.DATE); StringBuffer sb = new StringBuffer(); sb.append("設定されている日時は"); sb.append(year + "年" + month + "月" + day + "日"); sb.append("です。"); System.out.println(new String(sb)); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Calendar]$ javac testCalendar3.java [xxxxxxxx@dddddddddd Calendar]$ java testCalendar3 日時を2005/12/30に設定します 設定されている日時は2005年12月30日です。 -- -- -- -- -- -- 日を1ずつ増加させます 設定されている日時は2005年12月31日です。 設定されている日時は2006年1月1日です。 設定されている日時は2006年1月2日です。 設定されている日時は2006年1月3日です。 設定されている日時は2006年1月4日です。 設定されている日時は2006年1月5日です。 -- -- -- -- -- -- 日時を2006/1/31に設定します 設定されている日時は2006年1月31日です。 -- -- -- -- -- -- 月を1ずつ増加させます 設定されている日時は2006年2月28日です。 設定されている日時は2006年3月28日です。 設定されている日時は2006年4月28日です。 設定されている日時は2006年5月28日です。 [xxxxxxxx@dddddddddd Calendar]$ |
2つのCalendarクラスのオブジェクトを比較します。 compareTo public int compareTo(Calendar anotherCalendar)2 つの Calendar オブジェクトで表される時刻値 (エポックからのミリ秒単位のオフセット) を比較します。 パラメータ: anotherCalendar - 比較対象の Calendar 戻り値: 引数で表される時刻がこの Calendar の表す時刻と等しい場合の値は 0。この Calendar の時刻が 引数で表される時刻より前の場合は 0 未満の値。この Calendar の時刻が引数で表される時刻 より後の場合は、0 より大きい値 例外: NullPointerException - 指定された Calendar が null の場合 IllegalArgumentException - カレンダ値が無効なため、指定された Calendar オブジェクトの時 刻値を取得できない場合 比較するCalendarクラスのオブジェクトを1970 年 1 月 1 日 00:00:00.000 GMT (グレゴリオ暦)からの経過ミリ秒数の値に変換し、その値を比較します。結果は等しいか進んでいるか遅れているかの判別だけです。実際の差は得られません。 では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.util.Calendar; class testCalendar4{ public static void main(String args[]){ Calendar calendar1 = Calendar.getInstance(); System.out.println("日時1を2006/05/08 09:45:10に設定します"); calendar1.set(2006, 4, 8, 9, 45, 10); Calendar calendar2 = Calendar.getInstance(); System.out.println("日時2を2006/05/11 12:58:15に設定します"); calendar2.set(2006, 4, 11, 12, 58, 15); int diff = calendar1.compareTo(calendar2); if (diff == 0){ System.out.println("日付1と日付2は同じ日時です"); }else if (diff > 0){ System.out.println("日付1は日付2より進んでいます"); }else{ System.out.println("日付1は日付2より遅れています"); } } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Calendar]$ javac testCalendar4.java [xxxxxxxx@dddddddddd Calendar]$ java testCalendar4 日時1を2006/05/08 09:45:10に設定します 日時2を2006/05/11 12:58:15に設定します 日付1は日付2より遅れています [xxxxxxxx@dddddddddd Calendar]$ |
Calendarクラスのオブジェクトが保持している日時を、1970 年 1 月 1 日 00:00:00.000 GMT (グレゴリオ暦)からの経過ミリ秒数の形で取得します。 getTimeInMillis public long getTimeInMillis()この Calendar の時刻値をミリ秒で返します。 戻り値: エポックからの UTC ミリ秒値で表される現在時刻 2つのCalendarクラスのオブジェクトを比較する場合に、差分を計算するためなどにエポックからの経過ミリ秒の値に変換して差を取る場合などに使います。 では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.util.Calendar; class testCalendar5{ public static void main(String args[]){ Calendar calendar1 = Calendar.getInstance(); System.out.println("日時1を2006/05/08 09:45:10に設定します"); calendar1.clear(); calendar1.set(2006, 4, 8, 9, 45, 10); long millis1 = calendar1.getTimeInMillis(); System.out.println("エポックからの経過ミリ秒の値は" + millis1 + "です"); Calendar calendar2 = Calendar.getInstance(); System.out.println("日時2を2006/05/11 12:58:15に設定します"); calendar2.clear(); calendar2.set(2006, 4, 11, 12, 58, 15); long millis2 = calendar2.getTimeInMillis(); System.out.println("エポックからの経過ミリ秒の値は" + millis2 + "です"); long diff = millis2 - millis1; System.out.println("日時の差は" + diff + "ミリ秒です"); diff = diff / 1000; /* 秒以下切捨て */ long se = diff % 60; diff = diff / 60; long mi = diff % 60; diff = diff / 60; long ho = diff % 24; long day = diff / 24; System.out.println(day + "日と" + ho + "時" + mi + "分" + se + "秒"); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Calendar]$ javac testCalendar5.java [xxxxxxxx@dddddddddd Calendar]$ java testCalendar5 日時1を2006/05/08 09:45:10に設定します エポックからの経過ミリ秒の値は1147049110000です 日時2を2006/05/11 12:58:15に設定します エポックからの経過ミリ秒の値は1147319895000です 日時の差は270785000ミリ秒です 3日と3時13分5秒 [xxxxxxxx@dddddddddd Calendar]$ |
|