Javaで日時の計算や、取得、設定をするにはJava.utilパッケージのCalendarクラスを使用する。
このページではCalendarクラスについて詳しくまとめている。参考にしていただければと思う。
下記のページではCalendarクラス以外もまとめているので、こちらもオススメだ。
目次
JavaのCalendarクラス
Calendarクラスには、日時の情報の情報の取得や日付の計算・比較に役立つ様々なメソッドが用意されている。
Calendarオブジェクトの取得
Calendarクラスは抽象クラスなのでnew演算子を用いてオブジェクトを生成することはできないので注意しよう。Calendarクラスのオブジェクトの取得方法はこうだ。
Calendar.getInstance()
戻り値の型 |
public static Calendar |
内容 |
現在時刻のCalendarオブジェクトを取得する。 |
以下、Calendarクラスの細かいメソッドやフィールドを一通りまとめているが、とりあえず使い方がみたいという方は、サンプルコードを用意しているので、そこを閲覧してほしい。
主要フィールド
次のようなフィールドが用意されている。MONTHが0〜11なことに注意が必要だ。
YEAR |
年 |
MONTH |
月(0~11) |
DATE, DAY_OF_MONTH |
現在の月の何日目かを表す。 |
WEEK_OF_MONTH |
現在の月の何週目かを表す。 |
DAY_OF_WEEK |
現在の週の何日目かを表す。 |
AM_PM |
午前午後を表す。(午前0、午後1) |
HOUR |
午前または午後の何時かを表す。(0~11) |
HOUR_OF_DAY |
24時制で何時かを表す |
MINUTE |
何分かを表す。 |
SECOND |
何秒かを表す。 |
主なメソッド
主なメソッドは次の通りだ。
時間を加算するCalendarオブジェクト.add(int field,int amount))
戻り値の型 |
void |
内容 |
指定された時間量を指定されたカレンダフィールドに加算または減算する。 【例】現在の時間から 5 日を引く場合 add(Calendar.DAY_OF_MONTH, -5). 引数: field - カレンダフィールド。 amount - フィールドに追加される日付または時間の量。 |
フィールドを返すCalendarオブジェクト.get(int field,))
戻り値の型 |
Public int |
内容 |
指定されたカレンダフィールドの値を返す。 引数: field - 指定されたカレンダフィールド。 戻り値: 指定されたカレンダフィールドの値。 例外: 指定されたフィールドが範囲外の場合エラー(ArrayIndexOutOfBoundsException )が発生する。 |
指定された値に設定するCalendarオブジェクト.set(int field,int value)
戻り値の型 |
void |
内容 |
指定されたカレンダフィールドを指定された値に設定する。 引数: field - 指定されたカレンダフィールド。 value - 指定されたカレンダフィールドに設定する値。 |
Calendarオブジェクト.set(int year,int month,iint day)
戻り値の型 |
void |
内容 |
カレンダフィールド YEAR、MONTH、および DAY_OF_MONTH の値を設定する。ほかのカレンダフィールドの以前の値は保持される。保持されないようにする場合は、最初に clear() を呼び出して値を未定義に設定したあとsetメソッドで値を設定する。 引数: year - YEAR カレンダフィールドの設定に使用する値。 month - MONTH カレンダフィールドの設定に使用する値。 Month 値は 0 から始まる (1 月は 0 になる)。 date - DAY_OF_MONTH カレンダフィールドの設定に使用する値。 |
最大値を返すCalendarオブジェクト.getActualMaximum(int field)
戻り値の型 |
Public int |
内容 |
この Calendar に時間値を指定して、指定のカレンダフィールドが取り得る最大値を返す。 例えば引数field にCalendar.DATEを指定した場合はその月の末尾を返す。 引数: field - カレンダフィールド 戻り値: この Calendar の時間値に対する、指定されたカレンダフィールドの最大値 |
後の日付かを判定するCalendarオブジェクト.after(Calendar when)
戻り値の型 |
Public boolean |
内容 |
この日付が、指定された日付より後にあるかどうかを判定する。 引数: when - 日付 戻り値: Calendar オブジェクトが表す時点が when オブジェクトの表す時点より遅い場合だけ true、そうでない場合は false |
前の日付かを判定するCalendarオブジェクト.before(Calendar when)
戻り値の型 |
Public boolean |
内容 |
この日付が、指定された日付より前にあるかどうかを判定する。 引数: when - 日付 戻り値: Calendar オブジェクトが表す時点が when オブジェクトの表す時点より遅い場合だけ true、そうでない場合は false |
同じ日付かを判定するCalendarオブジェクト.equals(Object obj)
戻り値の型 |
Public boolean |
内容 |
2 つの日付が等しいかどうかを比較する。引数が null ではなく、かつ、このオブジェクトとミリ秒まで同じ時点を表す Calendar オブジェクトであれば、true を返す。 引数: obj - 比較対象のオブジェクト 戻り値: オブジェクトが同じである場合は true、そうでない場合は false |
日付を比較するCalendarオブジェクト.compareTo(Calendar anotherCalendar)
戻り値の型 |
Public int |
内容 |
順序付けのために 2 つの Calendar を比較する。 引数: anotherCalendar - 比較対象の Calendar 戻り値: 引数 anotherCalendar がこの Calendar と等しい場合は値 0。この Calendar が引数 anotherCalendar より前の場合は 0 より小さい値。この Calendar が引数 anotherCalendar より後の場合は 0 より大きい値 例外: ・指定された Calendar が null である場合、エラー(NullPointerException )が発生する。 ・カレンダ値が無効なため、指定された Calendar オブジェクトの時間値を取得できない場合、エラー(IllegalArgumentException )が発生する。 |
時間を取得するCalendarオブジェクト.getTime()
戻り値の型 |
final Date |
内容 |
この Calendar の時間値 (元期からのミリ秒単位のオフセット) を表す Date オブジェクトを返す。 戻り値: 時間値を表す Date。 |
解釈を設定するCalendarオブジェクト.setLenient(boolean lenient)
戻り値の型 |
Void |
内容 |
日付/時間の解釈を厳密に行うかどうかを設定する。初期設定では「非厳密」なので、「1996 年 2 月 942 日」のような日付は、1996 年 2 月 1 日から第 941 日目と同じこととみなされて不正な日であってもエラーにはならない。厳密な解釈に設定すると、このような日付の場合、例外が発生してエラーとなる。 引数: lenient - 非厳密モードがオンの場合は true、そうでない場合は false。
|
Calendarクラスのサンプルコード
それでは実際にいくつかのサンプルコードを見ていこう。
日時情報の取得と設定 サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class CalendarSample1 { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); System.out.println(cal);//[1] System.out.println(cal.getTime());//[2] System.out.println("YEAR: " + cal.get(Calendar.YEAR));//[3] System.out.println("MONTH: " + cal.get(Calendar.MONTH));//[4] System.out.println("DATE: " + cal.get(Calendar.DATE));//[5] cal.set(2016,0,1, 0, 0, 0); System.out.println(cal.getTime());//[6] cal.set(2016,1,30, 0, 0, 0); System.out.println(cal.getTime());//[7] } } |
実行結果
1 2 3 4 5 6 7 |
java.util.GregorianCalendar[time=1473010723045,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2016,MONTH=8,WEEK_OF_YEAR=37,WEEK_OF_MONTH=2,DAY_OF_MONTH=5,DAY_OF_YEAR=249,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=2,HOUR_OF_DAY=2,MINUTE=38,SECOND=43,MILLISECOND=45,ZONE_OFFSET=32400000,DST_OFFSET=0] Mon Sep 05 02:38:43 JST 2016 YEAR: 2016 MONTH: 8 DATE: 5 Fri Jan 01 00:00:00 JST 2016 Tue Mar 01 00:00:00 JST 2016 |
サンプルコードの説明
- [1] Calendarオブジェクトを取得し、表示→ Calendarクラスは抽象クラスなので、実際にはjava.util.GregorianCalendarクラスのオブジェクトが生成されている。また、多くの情報を保持しているのがよくわかるだろう。
- [2] 取得したCalendarオブジェクトをDate型に変換し、表示。
- [3] [4] [5] get()メソッドにフィールドYEAR、Calendar. MONTH,Calendar.DATEを引数で渡し、Calendarオブジェクトから必要な情報(年、月、日)を取得しそれぞれ表示。※月は0始まりなので9月の場合は8と表示される。月だけが0~11で表現されているので注意しよう。
- [6]2016年1月1日となるようにset()メソッドを使用して値をセットし表示。
- [7]ありえない日時(2016年2月30日)となる日付を設定し表示。エラーにはならずずれた日付を修正して表示。(日付指定が間違っていてもエラーにならないので注意しよう)
日時計算のサンプルコード
2つの日付の差を求めるサンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class CalendarSample2 { public static void main(String[] args) { Calendar cal1 = Calendar.getInstance();//[1] Calendar cal2 = Calendar.getInstance(); cal2.add(Calendar.MONTH, -7);//[2] System.out.println("cal1:" + cal1.get(Calendar.YEAR) + "/" + (cal1.get(Calendar.MONTH) + 1) + "/" + cal1.get(Calendar.DAY_OF_MONTH)); System.out.println("cal2:" + cal2.get(Calendar.YEAR) + "/" + (cal2.get(Calendar.MONTH) + 1) + "/" + cal2.get(Calendar.DAY_OF_MONTH)); long diffTime = cal1.getTimeInMillis() - cal2.getTimeInMillis();//[3] int diffDayMillis = 1000 * 60 * 60 * 24;//[4] int diffDays = (int) (diffTime / diffDayMillis); System.out.println("2つの日付の差は:" + diffDays + "日です。");//[5] } } |
実行結果
1 2 3 |
cal1:2016/9/5 cal2:2016/2/5 2つの日付の差は:212日です。 |
サンプルコードの説明
- [1] 現在の日時情報を持つCalendarオブジェクトcal1を生成
- [2] Calendarオブジェクトcal2に現在から7か月前の日時情報を設定。
- [3] 変数cal1とcal2それぞれのミリ秒数を取得し、その差を求める。
- [4] 差のミリ秒数を日単位に変換し、2つの日付の差を表示。
日付の整合性サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class CalendarSample3 { public static void main(String[] args) { //------非厳密(デフォルト) Calendar cal1 = Calendar.getInstance(); cal1.set(2016,12,31);//[1] System.out.println("cal1:" + cal1.get(Calendar.YEAR) + "/" + (cal1.get(Calendar.MONTH) + 1) + "/" + cal1.get(Calendar.DAY_OF_MONTH));//[2] //------厳密 Calendar cal2 = Calendar.getInstance(); cal2.setLenient(false);//[3] cal2.set(2016,12,31); try { System.out.println("cal2:" + cal2.get(Calendar.YEAR) + "/" + (cal2.get(Calendar.MONTH) + 1) + "/" + cal2.get(Calendar.DAY_OF_MONTH));//[4] } catch (IllegalArgumentException e) { System.out.println("日付が正しくありません");//[5] } } } |
実行結果
1 2 |
cal1:2017/1/31 日付が正しくありません |
サンプルコードの説明
- [1] 現在の日時情報を持つCalendarオブジェクトcal1を生成し、年→2106、月→12、日→31をセットする。
- [2]cal1の日付情報を取得し表示する。月は0~11で指定すべきなので本来なら12を設定したらおかしな日付となるが、非厳密な状態では2016年の13か月目と解釈され2017/1/31と表示される。
- [3] Calendarオブジェクトcal12に厳密モードに設定。
- [4]cal1と同様に年→2106、月→12、日→31をセットした後、表示させる。
- [5]get()メソッドを実行した際にエラーが発生(※)し「日付が正しくありません」が表示される。
(※)不正は日付を設定した時には日付のチェックは働かない。値を取得しようとしたときにチェック機能が働くという事に注意しよう。
まとめ
このページではJavaのCalendarクラスについてまとめてきたが、いかがだっただろうか?
日付に関することであれば、Calendarクラスを使えば困ることはほとんどないだろう。積極的に使っていただければと思う。