西暦と和暦の両方を使うには?


実務の面で和暦について考えると、「和暦のみ」が使えればいい、という状況はあまり多くはないことに気がつきます。和暦と西暦の両方が使えないといけないことのほうが多いんじゃないでしょうか。そこで、両方を利用する方法について考えてみましょう。

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()));
  Locale.setDefault(Locale.JAPAN);
  Calendar cal2 = Calendar.getInstance();
  SimpleDateFormat format2 =
      new SimpleDateFormat("GGGGyyyy-M-d");
  System.out.println(format2.format(cal2.getTime()));
}

和暦と西暦の両方を表示する


もっとも単純なのは、こういう方法です。つまり、Localeを設定して和暦(または西暦)での表示を行い、それが終わったらまたLocaleを設定して西暦(または和暦)を表示する、という方法ですね。

Localeは、一般的なLocale.JAPANなどに設定すれば、日本のロケールでかつ和暦ではない扱いになります。これとja_JP_JPのLocaleを使い分ければよいでしょう。

ただし、「和暦と西暦の利用がきれいに分かれている」という場合ならこれでもいいのですが、両方が混在するような場合、しょっちゅうLocale.setDefaultを変更するのはちょっと面倒です。こういう場合は、DateFormatを作成する際にLocaleを指定してインスタンスを生成するのがよいでしょう。

public static void main(String[] args) {
  Calendar cal =
      Calendar.getInstance(new Locale("ja","JP","JP"));
  SimpleDateFormat format1 =
      new SimpleDateFormat("GGGGyyyy-M-d",Locale.JAPAN);
    SimpleDateFormat format2 = new SimpleDateFormat
        ("GGGGyyyy-M-d",new Locale("ja","JP","JP"));
  System.out.println("西暦: " +
      format1.format(cal.getTime()));
  System.out.println("和暦: " +
      format2.format(cal.getTime()));
}


例えばSimpleDateFormatの場合、インスタンス作成時にLocaleを引数として渡すことで、指定のLocaleによるインスタンスを作成することができます。このようにして、あらかじめja_JP_JPのインスタンスとLocale.JAPANのインスタンスを用意しておけば、いつでも西暦と和暦による表示を行なうことができます。

この場合、Calendarはいちいち2つのLocaleを指定したものを用意する必要はありません。ja_JP_JPを指定してgetInstanceしたもの(つまりJapaneseImperialCalendarインスタンスとして作成されるもの)だけで、SimpleDateFormatを使って西暦によるフォーマットを行なわせることもできます。