日時の要素を取り出す
このCalendar(GregorianCalendar)というクラス、Dateより柔軟に日時を扱えるようになったのはいいのですが、より複雑になり、使い方をきっちり理解しないといけなくなりました。例えば、先ほどのサンプルを、DateからGregorianCalendarに書き直してみましょう。
import java.util.GregorianCalendar; // ……(略)…… public static void main(String args[]) { GregorianCalendar date = new GregorianCalendar(); System.out.println(date); GregorianCalendar date2 = new GregorianCalendar(2001,1,1); System.out.println(date2); }

mainメソッドを、このように修正して試してみましょう。今度は、非推奨メソッドを使った警告も現れず、すんなりとプログラムが実行できます。が、出力された内容は、なんだかわけが分からないものになっていますね。
Dateは、日時を示すコンピュータ上の値を管理するだけのシンプルなものだったため、printlnではその日時の値を一般的な形式で出力してくれました。が、 GregorianCalendarは、中身の複雑なものであるためか、そうした処理はしてくれません。printlnしても、インスタンスの内容がずらっと表示されるだけです。GregorianCalendarは、「日時を適当な形式で表示してくれる」という仕組みにはなっていないのです。
では、どうすればいいのか。1つの方法としては、「インスタンスから、年月日の情報を取り出して処理する」というものがあります。Calendar(GregorianCalendarも含めて)には、年月日時分秒のそれぞれの数値を取り出したり変更したりする機能があるので、これを利用して個々の値を取得し、表示すればよいのです。
import java.util.Calendar; // ……(略)…… public static void main(String args[]) { GregorianCalendar cal = new GregorianCalendar(); int y = cal.get(Calendar.YEAR); int m = cal.get(Calendar.MONTH); int d = cal.get(Calendar.DATE); System.out.println("今日は、" + y + "年" + (++m) + "月" + d + "日です。"); }

例えば、これは今日の日付を表示する簡単なサンプルです。ここでは、GregorianCalendarのインスタンス作成後、getというメソッドで、年月日のそれぞれの値を取り出しています。これは、引数に「どの要素を取り出すか」を示す値を指定して呼び出します。この要素の指定は、Calendarクラスの中にクラスフィールドとして次のように用意されています。
| クラスフィールド名 | 意味 |
| YEAR | 年の値 |
| MONTH | 月の値 |
| DATE, DAY_OF_MONTH | 日の値 |
| DAY_OF_WEEK | 週の何日目か(曜日) |
| HOUR, HOUR_OF_DAY | 時の値 |
| MINUTE | 分の値 |
| SECOND | 秒の値 |
| MILLISECOND | ミリ秒 |
これらは、Calendar.YEARというように、Calendarクラスの中のフィールドという形で指定します。注意が必要なのは、月の値を示すMONTHです。これは、1~12ではなく、0~11の値を返しますので、実際の月の値より1少なくなります。
日時のフォーマット
もう1つの方法は、日時の値を決まった形式でフォーマットするためのクラスを利用する、というものです。java.textパッケージに最も基本となるDateFormatというクラスが用意されています。通常は、これを継承して作られたSimpleDateFormatというクラスを利用します。これも前回登場しましたが覚えていますか?
このSimpleDateFormatは、表示フォーマットのパターンを示すテキストを引数に指定してインスタンスを作成します。クラスには、Dateの値をあらかじめ指定したフォーマットで表したテキストを作成するformatメソッドが用意されており、これを利用して日時をフォーマットします。このあたりの基本については前回説明しました。
では、フォーマットのパターンとなるテキストというのは、どのように設定すればよいのでしょうか。これは、あらかじめSimpleDateFormatに用意されている「パターン文字」と呼ばれる記号を使って記述します。どのようなパターン文字が用意されいるのかを調べ、それを組み合わせてString値を作成することで、日時のフォーマットを作成できます。では、用意されているパターン文字にはどのようなものがあるか、整理しておきましょう。
| パターン文字 | 意味 |
| G | 紀元 |
| y | 年 |
| M | 月 |
| w | 年における週(その年の何週目か) |
| W | 月における週(月の何週目か) |
| D | 年における日 |
| d | 月における日 |
| F | 月における曜日(その曜日が何度目か) |
| E | 曜日 |
| a | 午前/午後 |
| H | 一日における時 (0 ~ 23) |
| k | 一日における時 (1 ~ 24) |
| K | 午前/午後の時 (0 ~ 11) |
| h | 午前/午後の時 (1 ~ 12) |
| m | 分 |
| s | 秒 |
| S | ミリ秒 |
| z | タイムゾーン(一般的なタイムゾーン) |
| Z | タイムゾーン(RFC 822 タイムゾーン) |
yは、yyyyというように4つのyが並べると「4桁で表示する」ことができます。2桁表示にしたければ、yyとすればいいわけです。これはy以外のものでも同様で、例えば「月は常に2桁で表示させたい」と思えば、MMというようにMを2桁にします。
