【Java】日時の計算や取得に使えるCalendarクラスの使い方!

  • このエントリーをはてなブックマークに追加
  • Pocket
java calendar クラス

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] 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] 現在の日時情報を持つCalendarオブジェクトcal1を生成
  • [2] Calendarオブジェクトcal2に現在から7か月前の日時情報を設定。
  • [3] 変数cal1とcal2それぞれのミリ秒数を取得し、その差を求める。
  • [4] 差のミリ秒数を日単位に変換し、2つの日付の差を表示。

日付の整合性サンプルコード

実行結果

サンプルコードの説明

  • [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クラスを使えば困ることはほとんどないだろう。積極的に使っていただければと思う。

  • このエントリーをはてなブックマークに追加
  • Pocket

このページの続きや関連ページは下記から一覧で確認できる。

短期間でエンジニアになる方法

・「まったくの初心者だけどエンジニアになりたい!」

・「プログラマーとして転職をしたい!」

という方はリナックスアカデミーの資料を見てみてください。短期間で未経験からエンジニアになることができるスクールとして15年間選ばれ続けてきた理由やノウハウが載った資料です。

エンジニアの入り口に立つために必要な勉強技術の最新動向本当に使えるIT資格学習に役立つ国からの奨励金などの情報が詰まっています。

無料で2,3日中にお手元にお届けします。


資料を見てみる

SNSでもご購読できます。

コメントを残す

*