概要
和暦変換は帳票出力や公文書対応で避けて通れない処理です。Java には JapaneseChronology が標準で用意されており、外部ライブラリなしで和暦と西暦の変換ができます。ただし、元号境界(平成から令和の 2019/5/1 など)のエッジケースや、フォーマット文字列の落とし穴があるため、ロジック設計には注意が必要です。この記事では、JapaneseDate と DateTimeFormatter を使った変換の基本から、境界日の安全な処理、帳票向けの書式設定までを整理します。
使いどころ
帳票の日付欄を「令和○年○月○日」形式で出力する
ユーザーが入力した和暦日付を西暦の LocalDate に変換して DB に保存する
元号をまたぐ期間計算(平成30年〜令和2年は何年間か)を行う
コード例
import java.time.LocalDate;
import java.time.chrono.JapaneseDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class WarekiConverter {
private static final DateTimeFormatter WAREKI_FMT =
DateTimeFormatter.ofPattern("GGGGy年M月d日", Locale.JAPAN);
public static String toWareki(LocalDate date) {
var jpDate = JapaneseDate.from(date);
return WAREKI_FMT.format(jpDate);
}
public static LocalDate fromWareki(String wareki) {
var jpDate = JapaneseDate.from(
WAREKI_FMT.parse(wareki));
return LocalDate.from(jpDate);
}
public static void main(String[] args) {
var today = LocalDate.of(2025, 3, 15);
System.out.println(today + " → " + toWareki(today));
var parsed = fromWareki("令和7年3月15日");
System.out.println("令和7年3月15日 → " + parsed);
}
}Version Coverage
令和に完全対応。switch 式で元号略称の分岐が簡潔に書ける。record との組み合わせで変換結果を型安全に返せる。
// Java 17: switch 式で元号略称を分岐
int base = switch (era) {
case 'R' -> REIWA_BASE;
case 'H' -> HEISEI_BASE;
case 'S' -> SHOWA_BASE;
case 'T' -> TAISHO_BASE;
default -> throw new IllegalArgumentException(
"不明な元号略称: " + era);
};
return base + japYear;Library Comparison
注意点
JapaneseDate は明治6年(1873年)以降しか扱えない。
元号の境界日を正しく扱うため、JapaneseChronology.INSTANCE を使うこと。
DateTimeFormatter の和暦パターンはロケール依存のため、Locale.JAPAN を明示する。
FAQ
JDK のアップデートで新元号が追加されるため、JDK のバージョンを上げれば自動対応します。元号データは CLDR に含まれており、パッチリリースで配信されます。
DateTimeFormatter で FULL スタイルを使えば、1年目は自動的に「元年」と表示されます。
JapaneseDate は明治6年以降のみ対応です。それ以前は旧暦との対応が必要になるため、自前のロジックが必要です。