和暦クラス「JapaneseImperialCalendar」


日付の処理を行なうとき、どうしても必要になるのが「和暦」です。今までは、Javaには和暦の機能がありませんでした。このため、それぞれで西暦(グレゴリオ暦)を和暦に変換するようなクラスを書くなどして対応していたと思います。

が! Java 6になって、ようやく和暦のクラスが標準で用意されることになったのです。これは使うしかないでしょう! さっそくこのクラスを使ってみることにしましょう。

和暦対応のカレンダークラスは、「JapaneseImperialCalendar」というものです。が、実をいえばこのクラスは、Java 6のAPIを調べても載っていません。これはデフォルトアクセス・クラスとして用意されているため、外部から直接アクセスできないのです。

通常、カレンダークラスは、Calendar.getInstance()というようにしてインスタンスを作成して利用しますが、この際に和暦を利用するような状況だと、Javaは自動的にJapaneseImperialCalendarインスタンスとして作成するようになっています。つまり、今までCalendar.getInstance()とやっていたコードを変更することなく、自然に和暦の利用ができるようになっているのですね。

問題は、「どういう状況のときに、和暦クラスを使うのか?」ということでしょう。これは、Localeをチェックして判断しています。Java 6では、和暦用に「ja_JP_JP」というロケールが新たに用意されました。このロケールに設定してCalendar.getInstance()すると、和暦用のJapaneseImperialCalendarインスタンスを作成します。

では、実際に利用してみることにしましょう。今日の日付を和暦で表示するサンプルを考えてみます。

public static void main(String[] args) {
  Locale.setDefault(new Locale("ja","JP","JP"));
  Calendar cal = Calendar.getInstance();
  SimpleDateFormat format =
      new SimpleDateFormat("GGGGyyyy-M-d");
  System.out.println(format.format(cal.getTime()));
}

「平成」を使った和暦で日付が表示される。


ざっとこんな感じでしょうか。これを実行すると、「平成19-3-21」というように、和暦表示で今日の日付が表示されます。――ここでは、まず最初にLocaleを作成し、設定してます。

Locale.setDefault(new Locale("ja","JP","JP"));

今まで、ロケールの設定にはLocale.JAPANやLocale.JAPANESEなどを利用していた人も多いことと思います。一般的な日本のロケールとしてはこれでもいいのですが、和暦を使うためにはこれらではダメです。new Locale("ja","JP","JP")というようにして新たにja_JP_JPのロケールを作成し設定する必要があります。

重要なのは、「Calendarだけでなく、DateFormatもLocaleに影響される」という点です。実際に日付を利用する場合、ただCalendarで日付の値を扱っておしまい、ということはありません。最終的に、DateFormatでフォーマットされたStringを用意し、それを表示するなどするのが一般的でしょう。このDateFormatも、やはり正しくja_JP_JPにロケール設定がされていないときちんと和暦でフォーマットされません。

さて、このフォーマットについても触れておきましょう。一般に、日付のフォーマットはSimpleDateFormatを使って行なうことが多いでしょう。これで和暦をフォーマットする場合、「平成」などの表記はどう表すのでしょう? ――これは、実は「G」で表現されます。Gは、「西暦」「AD」「DC」などの表記に使われるものですね。現行の「平成」や「昭和」も、このGで表現されます。

このGが1桁だと、表記は「H」「S」といったイニシャルになります。「GGGG」というように4桁だと「平成」「昭和」といった正式な元号名が表示されます。