備忘録

PHPで西暦を和暦(令和、平成、昭和、大正、明治)に変換

PHP

西暦表示になっている日付データを和暦表示(例:2019/05/01を令和元年5月1日)に変換します

和暦表示で新元号の「令和」を対応することになったので対応したソースをアップします。

今後、新たに追加になった場合は配列に新しい元号と開始日・開始年を追加するこで対応することができます。

使い方

echo chgAdToJpDate('2019/05/01');

// 結果
// 令和元年5月1日

echo chgAdToJpDate('2019-4-30');

// 結果
// 平成31年4月30日

和暦変換

/**
 * 和暦変換(グレゴリオ暦が採用された「明治6年1月1日」以降に対応)
 * 引数:西暦(9999/99/99 or 9999-99-99)
 * 戻値:和暦
 */
function chgAdToJpDate($value) {
	//和暦変換用データ
	$arr = array(
		array('date' => '2019-05-01', 'year' => '2019', 'name' => '令和'),// 新元号追加
		array('date' => '1989-01-08', 'year' => '1989', 'name' => '平成'),
		array('date' => '1926-12-25', 'year' => '1926', 'name' => '昭和'),
		array('date' => '1912-07-30', 'year' => '1912', 'name' => '大正'),
		array('date' => '1873-01-01', 'year' => '1868', 'name' => '明治'),// 明治6年1月1日以降
	);
	// 日付チェック
	if (chkDate($value) === false) {
		return '';
	}
	$arrad  = explode('-', str_replace('/', '-', $value));
	$addate = (int)sprintf('%d%02d%02d', (int)$arrad[0], (int)$arrad[1], (int)$arrad[2]);
	$result = '';
	foreach ($arr as $key=>$row) {
		// 日付チェック
		if (chkDate($row['date']) === false) {
			return '';
		}
		$arrjp  = explode('-', str_replace('/', '-', $row['date']));
		$jpdate = (int)sprintf('%d%02d%02d', (int)$arrjp[0], (int)$arrjp[1], (int)$arrjp[2]);
		// 元号の開始日と比較
		if ($addate >= $jpdate) {
			// 和暦年の計算
			$year = sprintf('%d', ((int)$arrad[0] - (int)$row['year']) + 1);
			if ((int)$year === 1) {
				$year = '元';
			}
			// 和暦年月日作成
			$result = sprintf('%s%s年%d月%d日', $row['name'], $year, (int)$arrad[1], (int)$arrad[2]);
			break;
		}
	}
	return $result;
}

日付チェック

/**
 * 日付チェック
 * 引数:西暦(9999/99/99 or 9999-99-99)
 * 戻値:結果
 */
function chkDate($value) {
	if ((strpos($value, '/') !== false) && (strpos($value, '-') !== false)) {
		return false;
	}
	$value   = str_replace('/', '-', $value);
	$pattern = '#^([0-9]{1,4})-(0[1-9]|1[0-2]|[1-9])-([0-2][0-9]|3[0-1]|[1-9])$#';
	preg_match($pattern, $value, $arrmatch);
	if ((isset($arrmatch[1]) === false) || (isset($arrmatch[2]) === false) || (isset($arrmatch[3]) === false)) {
		return false;
	}
	if (checkdate((int)$arrmatch[2], (int)$arrmatch[3], (int)$arrmatch[1]) === false) {
		return false;
	}
	
	return true;
}

※グレゴリオ暦(新暦)が日本で正式に使用されるようになった明治6年1月1日から対応しています。

■令和

2019/05/01(令和元年5月1日) ~

■平成

1989/01/08(平成元年1月8日) ~ 2019/04/30(平成31年4月30日)

■昭和

1926/12/25(昭和元年12月25日) ~ 1989/01/07(昭和64年1月7日)

■大正

1912/07/30(大正元年7月30日) ~ 1926/12/24(大正15年12月24日)

■明治

1873/01/01(明治6年1月1日) ~ 1912/07/29(明治45年7月29日)

※太陰太陽暦(旧暦)は未対応

1868/01/25(明治元年1月1日) ~ 1872/12/31(明治5年12月2日)