Javaとクラスライブラリ CalendarとGregorianCalendarクラス(5-5)

記事上広告

Calendarクラスはその名前の通りカレンダーを扱うことができるクラスです。

CalendarクラスとそのサブクラスであるGregorianCalendarクラスについて説明します。

CalendarクラスとGregorianCalendarクラスの概要

CalendarとGregorianCalendarはjava.utilパッケージに属する為、importが必要です。

Calendarクラスは抽象クラスとなっており、Calendarクラス自身をインスタンス生成することはできません。(下のリンクはオラクル公式APIへのリンクです)

APIドキュメント(Calendar)

GregorianCalendarクラスはCalendarクラスを継承しており、現在利用されている暦であるグレゴリオ暦を扱うクラスです。(下のリンクはオラクル公式APIへのリンクです)

APIドキュメント(GregorianCalendar)

Calendarのオブジェクトを取得する

Calendarオブジェクトを扱う場合は、公式サイトおよびその他サイトでは以下のように記述されています。

カレンダーを扱うオブジェクトを取得する Calendar インスタンス変数名 = Calendar.getInstance() ;
記述例 Calendar now = Calendar.getInstance() ;

Calendarクラスはnew(インスタンス生成)できないため、CalendarクラスのgetInstance()メソッドを利用してインスタンスを取得しています。取得できるインスタンスはメソッド内で決定されますが、通常はGregorianCalendarクラスのインスタンスとなります。

つまり、以下の記述でも同様のオブジェクトが取得できます。

カレンダーを扱うオブジェクトを取得する GregorianCalendar インスタンス変数名 = new GregorianCalendar() ;
記述例 GregorianCalendar now = new GregorianCalendar() ;

getInstance()メソッドとnew GregorianCalendar()の違いや特徴は後述します。

このページではオブジェクトの取得はgetInstance()メソッドを利用しています。

日付の表示とカレンダーのフィールド

日付を表示する方法はいくつかありますが、今回はget()メソッドを利用します。

インスタンス取得後、get()メソッドを利用して日付を表示する際には、カレンダーのフィールドと併せて利用します。

カレンダーのフィールドは定数となっており、get()メソッドではどのフィールドを利用するかによって取得できる情報が変わります。以下はカレンダーフィールドの一部です。

修飾子と型 フィールド名 フィールドの概要
static int YEAR を取得および設定するためのフィールドです。
static int MONTH を取得および設定するためのフィールドです。ただし、0-11で月を表します(例えば、0は1月、11は12月)。
static int DATE を取得および設定するためのフィールドです。
static int HOUR を取得および設定するためのフィールドです。
static int MINUTE を取得および設定するためのフィールドです。
static int SECOND を取得および設定するためのフィールドです。
static int AM_PM 午前および午後を取得および設定するためのフィールドです。
static int DAY_OF_WEEK 曜日を取得および設定するためのフィールドです。

Calendarのメソッド サンプルプログラム

以下のプログラムを「Number47.java」という名前でWorkフォルダ内に保存します。

保存が完了したら、コマンドプロンプトを起動し、Number47.javaをコンパイルおよび実行してみましょう。※プログラムが長いため、必要に応じてコピペで確認してください

実行例

C:\work>javac Number47.java

C:\work>java Number47
2018年9月28日11時50分3秒

Calendarクラスのメソッド

今回はCalendarクラスで定義されているメソッドの一部を紹介します。また、下記表は簡易的な説明のため、詳細はAPIドキュメント(公式)を参照してください。

処理説明のフィールドとは、カレンダーの年や月などのことです。

メソッド名 戻り値の型 引数 処理内容
abstract add void int field, int amount 第一引数で指定したフィールドに、第二引数で指定した数値文加算もしくは減算する。
get int int field 引数で指定したフィールドの値を取得する。
static getInstance Calendar なし カレンダーオブジェクトを取得できる。
set void int field, int  value 第一引数で指定したフィールドに、第二引数で指定した数値を設定する。

補足1 カレンダーの月取得

月は0が1月、1が2月となり、11が12月とずれています。表示の際には1をプラスする処理が必要になります。逆にset()する際は実際の月から1を引いてください。

例えば、プログラムを実行する月が11月の場合は下記の出力は10と表示されます。

System.out.println(now.get(Calendar.MONTH)); //表示は10だが11月

now.set(Calendar.MONTH,1); //1月に変更ではなく2月

補足2 カレンダーのフィールド

Calendarクラスのいくつかのフィールド(定数)は単体で利用するものではなく、setやgetメソッドと合わせて利用するものがあります。

例えば、以下のようなプログラムを記述した場合、年や月を取得できません。

//下記の記述では「1」が出力される
System.out.println(Calendar.YEAR);
//下記の記述では「2」が出力される
System.out.println(Calendar.MONTH);

Calendar.YEARやCalendar.MONTHはその(定数)フィールド単体では使用しません。set()やget()では引数に「1を指定すると年」「2を指定すると月」などと決まっています。しかし、now.get(1)などの記述では1が何の数字であるかがわかりにくくなるため、その数字を定数を使って分かりやすくしています。(マジックナンバー「wikipedia]

Number47.javaの修正

Calendarクラスに関するメソッドをNumber47.javaのプログラムに追加して、確認します。

Number47.javaのプログラムに以下のプログラムを追加し、保存が完了したら、コマンドプロンプトを起動し、Number47.javaをコンパイルしてみましょう。※プログラムが長いため、必要に応じてコピペで確認してください

実行例

C:\work>javac Number47.java

C:\work>java Number47
2018年10月28日11時51分3秒
31日11時11分3秒

Calendar.getInstance()とGregorianCalendar

通常、カレンダーに関するオブジェクトを取得する際には、Calendar.getInstance()を利用します。この記述は多くの場合、取得できるのはGregorianCalendarクラスとなります。

つまり、GregorianCalendarクラスをインスタンス生成することでも同様のことが可能です。

getInstance()とGregorianCalendarクラスをインスタンス生成した後は記述は同様に扱えます。

下の記述ではgetInstance()メソッドで取得した後のインスタンスが属するクラスを確認しています。

GregorianCalendarクラスは、コンストラクタの引数に日時を指定することでカレンダーオブジェクトを生成することもできます。

カレンダー 復習問題

カレンダーオブジェクトを生成する際のメソッド名を選んでください
解答群
setCalendar
getCalendar
setInstance
getInstance
現在の日付から20日後の日付に設定したい場合の記述を選んでください
解答群
add(Calendar.DATE,20)
add(DATE,20)
set(Calendar.DATE,20)
set(DATE,20)
カレンダーの月を10月にセットしたい場合の記述を選んでください
解答群
add(Calendar.MONTH,10)
add(MONTH,10)
set(Calendar.MONTH,9)
set(MONTH,9)
現在の月が5月の場合、5月と表示したい場合の記述を選んでください
解答群
System.out.println(変数名.get(Calendar.MONTH) + 1);
System.out.println(変数名.get(Calendar.MONTH + 1));
System.out.println(変数名.set(Calendar.MONTH) + 1);
System.out.println(変数名.set(Calendar.MONTH + 1));
お疲れ様でした。

まとめ

  • CalendarオブジェクトはCalendar.getInstance()で取得できる
  • set、get、addなどのメソッドではカレンダーフィールド(定数)と組み合わせて利用する
  • 月は0が1月、12月は11と1ずれているので注意
参加 ブログランキング

記事頑張って書いたかもねー?と思う方は下を押してもらえるといいかなーなんて
にほんブログ村 IT技術ブログへ
にほんブログ村


Javaランキング

目次へのアクセス
スポンサーリンク
レクタングル

シェアする

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

フォローする

スポンサーリンク
レクタングル