8. 日時とその表現/タイムゾーン
この章では日時の取扱とその表現、およびタイムゾーンについて説明します。
8.1. カレンダー
日時の計算、および取得を行う場合には、java.util.Calendarクラスを使用します。Calendarは特定の日時情報を保持するクラスで、日時計算のためのメソッドも提供しています。ただしCalendarは抽象クラスなので、実際にはその実装クラスであるjava.util.GregorianCalendarを使用します。GregorianCalendarは世界のほとんどの地域で使用されている、グレゴリオ暦で日時を管理するクラスです。Calendarを取得するためには、CalendarのgetInstanceクラスメソッドか、GregorianCalendarのコンストラクタで作成します。
Calendar cal = Calendar.getInstance(); Calendar cal = new GregorianCalendar(2002, 4, 1);
CalendarのgetInstanceは現在時刻で初期化されたカレンダーを返します。GregorianCalendarはコンストラクタの引数で指定した日時で初期化されたカレンダーを返します。引数の無いコンストラクタを使用した場合には、現在時刻で初期化されたカレンダーを返します。
特定のフィールド(年・月・日など)の値を取得したい場合には、「get」メソッドを使用します。getメソッドの引数は1つで取得するフィールドを指定します。引数の値には、Calendarクラスで定義されているクラス変数を用います。
int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH);
フィールドを指定する上で使用する、主要なクラス変数を以下にまとめます。
ERA | ユリウス暦の年代(AD, BC) |
YEAR | 年 |
MONTH | 月。最初の月は0となります。 |
DATE, DAY_OF_MONTH | 現在の月の何日目かを表します。 |
WEEK_OF_MONTH | 現在の月の何週目かを表します。 |
DAY_OF_WEEK | 現在の週の何日目かを表します。 |
AM_PM | 午前午後を表します。 |
HOUR | 午前または午後の何時かを表します。 |
HOUR_OF_DAY | 24時制で何時かを表します。 |
MINUTE | 何分かを表します。 |
SECOND | 何秒かを表します。 |
Calendarには、それぞれの月を表すクラス変数JANUARY, FEBUARY...や、曜日SUNDAY, MONDAY...、午前・午後を表すクラス変数AM, PMも定義されています。
保持している日時を変化させたい場合には「add」「roll」「clear」「set」メソッドを使用します。addは特定のフィールドに対して、加算を行うメソッドです。負の数を指定すると、減算を意味します。
cal.add(Calendar.MONTH, 1); cal.add(Calendar.DATE, -1);
addメソッドは特定のフィールドの影響が、他のフィールドにも現れます。例えば「1月31日」に「1日」加えると、「2月1日」になります。それに対して、rollメソッドは特定のフィールドにしか変更を加えません。「1月31日」に「1日」加えると、「1月1日」となります。
cal.roll(Calendar.DATE, true); // 引数がtrueなら1加算、falseなら1減算 cal.roll(Calendar.DATE, 2);
clearは特定のフィールドの値を0にするメソッドです。引数のないclearメソッドを使用すると、全フィールドが初期化されます。
cal.clear(Calendar.SECOND);
setは特定のフィールドの値を指定するメソッドです。決まったフィールドに対して値を設定するものもあります。
cal.set(Calendar.YEAR, 1); cal.set(2002, 4, 1); // 年月日のフィールドに値を設定する
もしフィールドの最大値・最小値を越えて値を設定する(例えば日のフィールドに40)と、他のフィールドとあわせて補正が行われます。例えば「1月40日」は自動的に「2月9日」となります。
日時の比較を行う場合には、「after」「before」メソッドを使用します。複数のCalendarで管理されている日時の前後関係を調べる事ができます。
cal.after(cal2); cal.before(cal3);
(実習課題1)
プログラム引数で指定した年月のカレンダーを表示するコンソールプログラムを作成しなさい。
(実習課題2)
プログラム引数で指定した年がうるう年かどうか調べるコンソールプログラムを作成しなさい。