J2SE 6.0 (開発コード名:Mustang)において、和暦を扱う新たなカレンダークラスがAPIに追加されました。BugParadeにおいて、BugID:4609228として登録されているRFE(改善要望)が実装されたものです。なお、このクラスはデフォルトアクセス(パッケージローカル)なので、アプリケーションから直接扱うことはできません。Calendarクラスを介して扱います。
和暦を使用したサンプルプログラムを紹介します。画面イメージは以下です。
このプログラムのソースコードは以下です。
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クラスが利用できます。