SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

Java入門 (10) - さまざまな値とフォーマット

作って覚えるJavaプログラミングのススメ 第10回


日時の要素を取り出す

 このCalendarGregorianCalendar)というクラス、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);
}
実行すると、Calendarインスタンスの内容が表示される。これだと、今が何日の何時かよく分からない。
実行すると、Calendarインスタンスの内容が表示される。これだと、今が何日の何時かよく分からない。

 mainメソッドを、このように修正して試してみましょう。今度は、非推奨メソッドを使った警告も現れず、すんなりとプログラムが実行できます。が、出力された内容は、なんだかわけが分からないものになっていますね。

 Dateは、日時を示すコンピュータ上の値を管理するだけのシンプルなものだったため、printlnではその日時の値を一般的な形式で出力してくれました。が、 GregorianCalendarは、中身の複雑なものであるためか、そうした処理はしてくれません。printlnしても、インスタンスの内容がずらっと表示されるだけです。GregorianCalendarは、「日時を適当な形式で表示してくれる」という仕組みにはなっていないのです。

 では、どうすればいいのか。1つの方法としては、「インスタンスから、年月日の情報を取り出して処理する」というものがあります。CalendarGregorianCalendarも含めて)には、年月日時分秒のそれぞれの数値を取り出したり変更したりする機能があるので、これを利用して個々の値を取得し、表示すればよいのです。

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値を作成することで、日時のフォーマットを作成できます。では、用意されているパターン文字にはどのようなものがあるか、整理しておきましょう。

SimpleDateFormatで利用可能なパターン文字
パターン文字意味
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桁にします。

次のページ
日時の加算・減算

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2795 2008/07/30 09:30

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー