こんにちは。開発ブログ運営担当のktです。
前回の更新からかなり空いてしまいました。
2019年の4月30日で平成が終わって、5月1日から新しい元号に変わりますね。
官公庁のシステムや帳票があるシステムでは、元号付きの和暦を表示するシステムも多いんじゃないでしょうか。
JavaではJava6から元号に対応したクラスが追加されていますし、
Java8ではJapaneseDateクラスを利用しての元号表示も出来るようになっています。
そういった機能を利用しているシステムでは、新元号に対応したアップデートを適用すればOKです。
ただし、Javaのリリースサイクルも変更されましたし、アップデートが新元号の開始日に間に合うかどうかはまだ不明です。
そこで今回は自前で新元号に対応する方法を紹介します。
前提
今回試しているのはJava9です。
ネットで検索するとcalendars.propertiesを修正して新元号を追加する方法がヒットしますが、
このファイルが含まれているのはJava8まででJava9には含まれていませんので同じ方法は利用できません。
対応方法
システムプロパティ(jdk.calendar.japanese.supplemental.era)に追加したい新元号の名称、略語、
新元号が始まる日付のエポックミリ秒を設定します。
今回の場合は、新元号は炎上プロジェクトが無くなることを願って「炎無」、略語は「E」、
2019年5月1日を表すエポックミリ秒は「1556668800000」を設定します。
Javaの実行時のオプションに下記を設定します。
-Djdk.calendar.japanese.supplemental.era="name=炎無,abbr=E,since=1556668800000"
下記の確認用のソースを実行します。
Eclipseから実行する場合、実行の構成でVM引数に上記のオプションを設定します。
import java.time.chrono.JapaneseDate; import java.time.chrono.JapaneseDate; import java.time.format.DateTimeFormatter; public class NewGengoTest { static DateTimeFormatter WAREKI_KANJI = DateTimeFormatter.ofPattern("GGGGyy年MM月dd日"); static DateTimeFormatter WAREKI_ALPHABET = DateTimeFormatter.ofPattern("GGGGGyy年MM月dd日"); public static void main(String[] args) { JapaneseDate lastHeiseiDate = JapaneseDate.of(2019, 4, 30); JapaneseDate newGengoStartDate = JapaneseDate.of(2019, 5, 1); System.out.println(lastHeiseiDate.format(WAREKI_KANJI)); System.out.println(newGengoStartDate.format(WAREKI_KANJI)); System.out.println(newGengoStartDate.format(WAREKI_ALPHABET)); } }
コンソール出力結果です。
ちゃんと5月1日から新元号に切り替わっていますね。
平成31年04月30日 炎無01年05月01日 E01年05月01日
まとめ
Java10のソースもJava9と同じ仕様になっていたので、現時点では同じ対応で大丈夫かと思います。
正式にリリースされたらJava10でも試してみようと思います。
※2018年3月29日追記 Java10(OracleJDKで試しました)でも同じ結果になりました。
Javaのアップデートを待つのか、自前で対応するのか判断が必要ですが、
いずれにしても影響箇所のテストがあるので新元号は早めに発表してほしいものですね。