概要

和暦変換は帳票出力や公文書対応で避けて通れない処理です。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);
    }
}

Java 8 / 17 / 21 の完全なサンプルコードは GitHub リポジトリ で確認できます。

Version Coverage

令和に完全対応。switch 式で元号略称の分岐が簡潔に書ける。record との組み合わせで変換結果を型安全に返せる。

Java 17
// 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

標準 API(JapaneseDate + DateTimeFormatter)和暦変換だけが必要で依存を増やしたくないとき。JDK のアップデートで新元号にも自動対応する。明治6年以前は扱えない。フォーマットパターンの指定にはロケールの知識が必要。
ICU4Jより高度な国際化や暦体系が必要な場合。JAR サイズが大きく(約11MB)、和暦変換だけなら標準 API で十分。

注意点

JapaneseDate は明治6年(1873年)以降しか扱えない。

元号の境界日を正しく扱うため、JapaneseChronology.INSTANCE を使うこと。

DateTimeFormatter の和暦パターンはロケール依存のため、Locale.JAPAN を明示する。

FAQ

令和以外の新しい元号が追加された場合はどうなりますか?

JDK のアップデートで新元号が追加されるため、JDK のバージョンを上げれば自動対応します。元号データは CLDR に含まれており、パッチリリースで配信されます。

和暦の表示で「元年」と表示するにはどうしますか?

DateTimeFormatter で FULL スタイルを使えば、1年目は自動的に「元年」と表示されます。

明治以前の日付を和暦で扱えますか?

JapaneseDate は明治6年以降のみ対応です。それ以前は旧暦との対応が必要になるため、自前のロジックが必要です。

関連書籍

この記事のテーマをさらに深く学びたい方へ。

※ Amazon アソシエイトリンクを含みます