Calendarクラスはその名前の通りカレンダーを扱うことができるクラスです。
CalendarクラスとそのサブクラスであるGregorianCalendarクラスについて説明します。
もくじ
CalendarクラスとGregorianCalendarクラスの概要
CalendarとGregorianCalendarはjava.utilパッケージに属する為、importが必要です。
Calendarクラスは抽象クラスとなっており、Calendarクラス自身をインスタンス生成することはできません。(下のリンクはオラクル公式APIへのリンクです)
GregorianCalendarクラスはCalendarクラスを継承しており、現在利用されている暦であるグレゴリオ暦を扱うクラスです。(下のリンクはオラクル公式APIへのリンクです)
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をコンパイルおよび実行してみましょう。※プログラムが長いため、必要に応じてコピペで確認してください
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import java.util.Calendar; class Number47{ public static void main(String[] args){ //カレンダーのオブジェクトを取得(GregorianCalendarのインスタンス) Calendar now = Calendar.getInstance() ; int year = now.get(Calendar.YEAR); int month = now.get(Calendar.MONTH); int date = now.get(Calendar.DATE); int hour = now.get(Calendar.HOUR); int minute = now.get(Calendar.MINUTE); int second = now.get(Calendar.SECOND); System.out.print(year + "年"); System.out.print(month + "月"); System.out.print(date + "日"); System.out.print(hour + "時"); System.out.print(minute + "分"); System.out.println(second + "秒"); } } |
実行例
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をコンパイルしてみましょう。※プログラムが長いため、必要に応じてコピペで確認してください
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import java.util.Calendar; class Number47{ public static void main(String[] args){ //カレンダーのオブジェクトを取得(GregorianCalendarのインスタンス) Calendar now = Calendar.getInstance() ; int year = now.get(Calendar.YEAR); int month = now.get(Calendar.MONTH) + 1; //月を修正 int date = now.get(Calendar.DATE); int hour = now.get(Calendar.HOUR); int minute = now.get(Calendar.MINUTE); int second = now.get(Calendar.SECOND); System.out.print(year + "年"); System.out.print(month + "月"); System.out.print(date + "日"); System.out.print(hour + "時"); System.out.print(minute + "分"); System.out.println(second + "秒"); //追加(300000秒を追加し、確認する) now.add(Calendar.SECOND, +300000); System.out.print(now.get(Calendar.DATE) + "日"); System.out.print(now.get(Calendar.HOUR) + "時"); System.out.print(now.get(Calendar.MINUTE) + "分"); System.out.println(now.get(Calendar.SECOND) + "秒"); } } |
実行例
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()メソッドで取得した後のインスタンスが属するクラスを確認しています。
1 2 |
Calendar c = Calendar.getInstance(); System.out.println(c.getClass()); |
GregorianCalendarクラスは、コンストラクタの引数に日時を指定することでカレンダーオブジェクトを生成することもできます。
1 2 3 4 |
//現在の日時を用いてカレンダーオブジェクトを生成する GregorianCalendar gc1 = new GregorianCalendar(); //指定した日付でカレンダーオブジェクトを生成する(月は1月) GregorianCalendar gc2 = new GregorianCalendar(2018,0,1); |
カレンダー 復習問題
- カレンダーオブジェクトを生成する際のメソッド名を選んでください
- 解答群
- 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ずれているので注意