[Java How To Programming] [Home on 246net] [Home on Alles net]
Powered by SmartDoc

和暦を扱う

TAKAHASHI, Toru
torutk@02.246.ne.jp

目次

和暦を利用する

java.util.JapaneseImperialCalendar

J2SE 6.0 (開発コード名:Mustang)において、和暦を扱う新たなカレンダークラスがAPIに追加されました。BugParadeにおいて、BugID:4609228として登録されているRFE(改善要望)が実装されたものです。なお、このクラスはデフォルトアクセス(パッケージローカル)なので、アプリケーションから直接扱うことはできません。Calendarクラスを介して扱います。

JDK6.0 b50での利用例

和暦を使用したサンプルプログラムを紹介します。画面イメージは以下です。

このプログラムのソースコードは以下です。

SampleJapaneseImperialCalendar.java
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class SampleJapaneseImperialCalendar extends JFrame {

    public SampleJapaneseImperialCalendar() {
        super("和暦のサンプル");
        JPanel panel = new JPanel();
        gregorianTextField = new JFormattedTextField(
            new SimpleDateFormat("yyyy/MM/dd")
        );
        gregorianTextField.setValue(new Date());
        imperialLocale = new Locale("ja", "JP", "JP");
        imperialCalendar = Calendar.getInstance(imperialLocale);
        imperialDateFormat = DateFormat.getDateInstance(
            DateFormat.LONG, imperialLocale
        );
        convertButton = new JButton("変換");
        convertButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ev) {
                    Date theDate = (Date)gregorianTextField.getValue();
                    imperialDateLabel.setText(
                        imperialDateFormat.format(theDate)
                    );
                }
            }
        );

        imperialDateLabel = new JLabel("--------");

        panel.add(gregorianTextField);
        panel.add(imperialDateLabel);
        panel.add(convertButton);
        add(panel);
    }

    public static void main(final String[] args) {
        JFrame app = new SampleJapaneseImperialCalendar();
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        app.setBounds(100, 100, 320, 320);
        app.setVisible(true);
    }

    private JFormattedTextField gregorianTextField;
    private JButton convertButton;
    private JLabel imperialDateLabel;
    private Calendar imperialCalendar;
    private Locale imperialLocale;
    private DateFormat imperialDateFormat;
}

和暦クラス(java.util.JapaneseImperialCalendar)のインスタンスを取得するには、java.util.CalendarクラスのgetInstanceメソッドを利用します。引数に、以下の条件に合致するLocaleインスタンスを渡すことによって、和暦カレンダーのインスタンスを取得することができます。

通常の日本語ロケール(Locale.JAPAN)では、getVariant()が空文字列を返却するので、getInstance()メソッドは和暦を扱うオブジェクトを返却しません。そこで、variant、country、languageを全て指定してLocaleオブジェクトを生成し、これを指定してCalendarクラスのgetInstanceメソッドを呼びます。

和暦クラス(JapaneseImperialCalendar)のポイントは、get(Calendar.YEAR)とget(Calendar.ERA)の戻り値です。まず、YEARは明治/大正/昭和/平成のいずれかにおける年数を返却するようになります。ERAは、元号がいずれかを示す定数を返却するようになります。

定数値 元号
0 N/A(明治から平成に該当しない場合)
1 明治
2 大正
3 昭和
4 平成

例えば、2005年1月1日ならば、get(Calendar.YEAR)は17を返却し、get(Calendar.ERA)は4を返却します。年号の切り替えも、日を見てきちんと処理されているようです。例えば1989年の1月7日は昭和扱い、1月8日は平成扱いとなって、get(Calendar.ERA)とget(Calendar.YEAR)の戻り値が変わります。

和暦の表示には、java.text.DateFormatクラスが利用できます。