和暦年月日を西暦年月日に変換する – warekiToYear()

  • タグ:
  • タグはありません
<?php
// 西
echo warekiToYear('231024', 'UTF-8') . '<br />' . PHP_EOL;
echo warekiToYear('H231024', 'UTF-8') . '<br />' . PHP_EOL;
echo warekiToYear('H23-10-24', 'UTF-8') . '<br />' . PHP_EOL;
echo warekiToYear('H23.10.24', 'UTF-8') . '<br />' . PHP_EOL;
/**
* 西
*
* @param string $strYmd 西
* @param string $encoding
* @return string 西(OK) / NULL(NG)
* @exception Exception
* @cation
*/
function warekiToYear($strYmd, $encoding = NULL)
{
try {
$judgeNengos = array(
'' => array('nengo' => '', 'start' => '1868-09-08', 'end' => '1912-07-29', 'baseYear' => 1867),
'' => array('nengo' => '', 'start' => '1912-07-30', 'end' => '1926-12-24', 'baseYear' => 1911),
'' => array('nengo' => '', 'start' => '1926-12-25', 'end' => '1989-01-07', 'baseYear' => 1925),
'' => array('nengo' => '', 'start' => '1989-01-08', 'end' => '9999-12-31', 'baseYear' => 1988)
);
$judgeNengos['m'] =& $judgeNengos[''];
$judgeNengos['t'] =& $judgeNengos[''];
$judgeNengos['s'] =& $judgeNengos[''];
$judgeNengos['h'] =& $judgeNengos[''];
//
if ($encoding === NULL) {
// 使
$encoding = mb_internal_encoding();
}
// 1
$strYmd = str_replace('', '1', $strYmd);
//
$strYmd = preg_replace('/\s/is', ' ', $strYmd);
if ($strYmd === FALSE) {
throw new Exception('');
}
// a
// s
$strYmd = mb_convert_kana($strYmd, 'as', $encoding);
//
$strYmd = strtolower($strYmd);
//
$matches = NULL;
if (! preg_match('/||||m|t|s|h/is', $strYmd, $matches)) {
throw new Exception('');
}
//
$nengo = $matches[0];
if (! array_key_exists($nengo, $judgeNengos)) {
throw new Exception('');
}
//
$strYmd = str_replace($nengo, '', $strYmd);
//
$strYmd = preg_replace('/[^\d]+/', ' ', $strYmd);
if ($strYmd === FALSE) {
throw new Exception('');
}
list($wareki, $month, $day) = sscanf($strYmd, '%s %s %s');
// 20
$month = sprintf('%02d', $month);
$day = sprintf('%02d', $day);
if (! preg_match('/\d{1,2}/', $wareki)) {
throw new Exception('');
}
if ($wareki <= 0) {
throw new Exception('1');
}
$judgeNengo = $judgeNengos[$nengo];
// 西
$year = $wareki + $judgeNengo['baseYear'];
$ymd = "$year-$month-$day";
$bMatch = FALSE;
foreach ($judgeNengos as $nengos) {
if ($nengos['start'] <= $ymd && $ymd <= $nengos['end']) {
$bMatch = TRUE;
break;
}
}
if (! $bMatch) {
throw new Exception('');
}
//
if (! checkdate($month, $day, $year)) {
throw new Exception('');
}
return $ymd;
} catch (Exception $e) {
echo $e->getMessage();
}
}
?>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX