LoginSignup
8
11

More than 3 years have passed since last update.

[PHP]西暦を和暦に変換する

Posted at

何度か西暦を和暦に変換する処理を書く機会があったので、
また必要になった時に汎用的に使い回せるよう、関数を作成しました。

なお、日本では明治5年12月2日(西暦1872年12月31日)に旧暦(天保暦)を廃止し、その翌日からグレゴリオ暦に移行して明治6年(1873年)1月1日になったため、明治5年以前の日付には対応していません。
※明治5年以前の場合は西暦で返します。


/**
 * 西暦→和暦変換
 *
 * @param string $format 'K':元号
 *                       'k':元号略称
 *                       'Q':元号(英語表記)
 *                       'q':元号略称(英語表記)
 *                       'X':和暦年(前ゼロ表記)
 *                       'x':和暦年
 * @param string $time 変換対象となる日付(西暦)‎
 *
 * @return string $result 変換後の日付(和暦)‎
 */
function to_wareki($format, $time='now')
{
    // 元号一覧
    $era_list = [
        // 令和(2019年5月1日〜)
        [
            'jp' => '令和', 'jp_abbr' => '令',
            'en' => 'Reiwa', 'en_abbr' => 'R',
            'time' => '20190501'
        ],
        // 平成(1989年1月8日〜)
        [
            'jp' => '平成', 'jp_abbr' => '平',
            'en' => 'Heisei', 'en_abbr' => 'H',
            'time' => '19890108'
        ],
        // 昭和(1926年12月25日〜)
        [
            'jp' => '昭和', 'jp_abbr' => '昭',
            'en' => 'Showa', 'en_abbr' => 'S',
            'time' => '19261225'
        ],
        // 大正(1912年7月30日〜)
        [
            'jp' => '大正', 'jp_abbr' => '大',
            'en' => 'Taisho', 'en_abbr' => 'T',
            'time' => '19120730'
        ],
        // 明治(1873年1月1日〜)
        // ※明治5年以前は旧暦を使用していたため、明治6年以降から対応
        [
            'jp' => '明治', 'jp_abbr' => '明',
            'en' => 'Meiji', 'en_abbr' => 'M',
            'time' => '18730101'
        ],
    ];

    $dt = new DateTime($time);

    $format_K = '';
    $format_k = '';
    $format_Q = '';
    $format_q = '';
    $format_X = $dt->format('Y');
    $format_x = $dt->format('y');

    foreach ($era_list as $era) {
        $dt_era = new DateTime($era['time']);
        if ($dt->format('Ymd') >= $dt_era->format('Ymd')) {
            $format_K = $era['jp'];
            $format_k = $era['jp_abbr'];
            $format_Q = $era['en'];
            $format_q = $era['en_abbr'];
            $format_X = sprintf('%02d', $format_x = $dt->format('Y') - $dt_era->format('Y') + 1);
            break;
        }
    }

    $result = '';

    foreach (str_split($format) as $val) {
        // フォーマットが指定されていれば置換する
        if (isset(${"format_{$val}"})) {
            $result .= ${"format_{$val}"};
        } else {
            $result .= $dt->format($val);
        }
    }

    return $result;
}

作成した関数を使って、和暦に変換してみます。

echo to_wareki('KX年m月d日', '18730101').PHP_EOL;
echo to_wareki('kx/n/j', '1914/08/07').PHP_EOL;
echo to_wareki('Qx-m-d', '1947-05-16').PHP_EOL;
echo to_wareki('m/d/Y(qX) H:i:s', '2016-03-20 12:34:56').PHP_EOL;
echo to_wareki('Y(Kx)年n月j日');

出力結果は以下の通りです。

明治06年01月01日
大3/8/7
Showa22-05-16
03/20/2016(H28) 12:34:56
2020(令和2)年7月30日

和暦変換プログラム自体はとくに目新しさはないですが、色々なフォーマットに対応できるようにしてみました。
もしよかったらぜひ試してみてください。

8
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
11