和暦はどうやって使う?
ここまでは、西暦を使って日時を扱ってきましたが、日本では「和暦」も多く用いられています。和暦というのは、「平成」「昭和」といった、元号による暦のことです。これは、利用できるのでしょうか。
和暦は、Java 6から新たにサポートされるようになりました。が、和暦を利用するための新たなクラスなどは特に覚える必要はありません。今までのGregorianCalendarとSimpleDateFormatによる日時の扱いそのままでいいのです。ただし、日時を扱う前に、ちょっとした下準備をしておく必要があります。
import java.util.Locale; // ……(略)…… public static void main(String args[]) { Locale.setDefault(new Locale("ja","JP","JP")); GregorianCalendar cal = new GregorianCalendar(); SimpleDateFormat format = new SimpleDateFormat("GGGG yy 年 M月 d日 (E曜日)"); System.out.println(format.format(cal.getTime())); }

これは、今日の日付を和暦で表示するサンプルです。日時の扱いに関する部分は、今まで作成したサンプルそのままで、特に新しいことはありません。違っているのは、一番最初にあるこの文だけです。
Locale.setDefault(new Locale("ja","JP","JP"));
これは、「ロケール情報」と呼ばれる地域情報に関する設定を行っているのです。Javaでは、現在のシステムがどの地域(ロケール)にあるかを内部で管理しています。普通に日時を扱うと、自動的に日本時間として日時が扱われるのも、内部でロケール情報が設定されているからなのです。
このロケール情報は、setDefaultメソッドで変更することができます。ここでは、新たにnew Locale("ja","JP","JP")というLocaleインスタンスを設定しています。ここで作成したのが「和暦使用のための日本ロケール」を示すLocaleインスタンスなのです。これをロケールとして設定することで、自動的に和暦が使われるようになります。まぁ、このあたりは、ロケールとローカライズに関する理解がないと難しいかも知れません。よく分からなければ、とりあえず「この1行を最初に書いておけば和暦が使えるんだ」とだけ覚えておけばよいでしょう。
西暦と和暦の違いは、フォーマットの際のパターン文字の扱いに現れます。和暦では、紀元を示すGが、元号として扱われるようになります。ここではGGGGと4桁のGが使われていますが、こうすると「平成」といった正しい元号が表示されます。3桁以下だと「H」というようにイニシャルによる省略された元号の指定になります。
以上、日時の値の基本的な扱い方について、一通り説明をしました。GregorianCalendarとSimpleDateFormatの基本さえ分かれば、決して難しいものではありません。基本的な値の操作がきちんとできるようになっておきましょう。
数値のフォーマット
日時の扱いでは、「フォーマット」が非常に重要になりました。日付を扱うCalendarインスタンスだけがあっても、それをきちんと西暦や和暦で表現できないと役には立たないのですから。
こうした「フォーマット」のための機能というのは、日時以外の値にもあります。例えば、数字。数字は、実際に表示される際には「10,000」というように3桁ごとにカンマで区切って表示するのが一般的です。こうした数値のフォーマットを行う場合には、java.textパッケージのNumberFormatというクラスを利用します。
このNumberFormatは、newでインスタンスを作成しません。getInstanceというメソッドを呼び出してインスタンスを取得します。そして、SimpleDateFormatと同様に、formatメソッドを呼び出して数字をフォーマットしたStringを得ます。実際にやってみましょう。
import java.text.NumberFormat; // ……(略)…… public static void main(String args[]) { int n = 1234567; NumberFormat format = NumberFormat.getInstance(); System.out.println(format.format(n)); }

たったこれだけです。nの値をいろいろと変更して試してみましょう。日付と違い、数値のフォーマットは、パターン文字などを使って表示形式を設定したりする必要がありません。日本では、数値は「3桁ごとにカンマ」と決まっていますから、わざわざ設定する必要がないのです。
が、世の中には、別の形式でフォーマットする国も存在します。そうした場合にはどうすればよいのか? インスタンスを取得する際、「国のロケール情報」を指定してやればよいのです。
public static void main(String args[]) { int n = 1234567; NumberFormat format = NumberFormat.getInstance(Locale.GERMANY); System.out.println(format.format(n)); }

例えば、これはドイツでのフォーマット形式で数字を表示させた例です。getInstanceのところでLocale.GERMANYと引数を与えていますね? これは、ドイツのロケール情報を示すLocaleです。これにより、ドイツでのフォーマットを扱うNumberFormatインスタンスが作成されます。まぁ、あまり外国の数値フォーマットを必要とする人は多くはないでしょうが、「Localeを指定すれば簡単にできる」ということは知っておくとよいでしょう。主な国のロケールは、Localeクラスにクラスフィールドとして用意されています。非常に数が多いのでここでは掲載しませんが、興味ある人は一度Java Platform API仕様などで確認されると良いでしょう。
