何度か西暦を和暦に変換する処理を書く機会があったので、
また必要になった時に汎用的に使い回せるよう、関数を作成しました。
なお、日本では明治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日
和暦変換プログラム自体はとくに目新しさはないですが、色々なフォーマットに対応できるようにしてみました。
もしよかったらぜひ試してみてください。