書類に書く和暦にどうしても違和感を感じてしまう、ユゲタです。
役所の資料を見る時に、書かれている日付が、「令和2年○月○日」となっていますが、「平成」「昭和」と書かれるよりも、「20xx年」と書いてくれる方が、わかりやすい上、いろいろなミスも生み出さないと思うんだけど、いろいろな場面でこうした和暦での表記を見かけることが多い事に気が付きます。
そもそも、こうした役所の資料を扱うシステム案件を受けたんですが、日付の管理の和暦が、データを保持する時のログの値としては、極めて好ましくないので、こうした和暦の日付データを西暦の日付に変換する関数をPHPで作ったので、今回はそれを公開しておきます。
本日のIT謎掛け
「dateフォーマット」と、かけまして・・・
「外見が派手なだけはなく、実力もある人」と、ときます。
そのココロは・・・
ダテじゃないよ。
和暦を西暦に返るポイント
和暦は「明治」「大正」「昭和」「平成」「令和」を西暦に変換する事を目的にしているので、それぞれの元年の西暦値を保持しておき、それぞれの年数を足すことで西暦に変換するというさほど難しくないコンバート方法をとります。
この際に、和暦のデータは、全角数値が使われる場合が多いので、全角数値を半角数値に変換する処理も加えたいと思います。
プログラミング
<?php
class era{
public static $era_pattern = array(
"明治" => 1867,
"大正" => 1911,
"昭和" => 1925,
"平成" => 1988,
"令和" => 2018
);
// 和暦(元号)を西暦に変換 : 昭和47年3月1日 -> 1972.3.1
public static function j2e($era_string="" , $format=""){
if(!$era_string){return null;}
preg_match('/^(明治|大正|昭和|平成|令和)(.+?)年?(.+?)月(.+?)日$/' , trim($era_string) , $match);
if($match && isset(self::$era_pattern[$match[1]])){
$num = mb_convert_kana($match[2], "KVa");
return self::output_ymd_format(
$format,
self::$era_pattern[$match[1]] + (int)$num,
mb_convert_kana($match[3], "KVa"),
mb_convert_kana($match[4], "KVa")
);
}
else{
return null;
}
}
public static function output_ymd_format($format="",$year,$month,$day){
if($format){
$format = str_replace("y" , $year , $format);
$format = str_replace("m" , $month , $format);
$format = str_replace("d" , $day , $format);
return $format;
}
else{
return array(
"year" => $year,
"month" => $month,
"day" => $day
);
}
}
}
実行
era::j2e("昭和47年3月1日" , "y/m/d");
> 1972/3/1
僕の生年月日が、無事に変換できました。
解説
プログラムを少し解説しておきます。
まず、class名のeraは、英語で「時代」という意味があったので、採用してみました。
$era_patternという連想配列に、それぞれの元号の元年-1の値を保持しています。
-1する意味としては、例えば、令和元年は、2019なんですが、2018+1という処理にするために、1を引いて、0年の値として埋め込んでいます。
次に、元号を正規表現で、年月日それぞれの値を取得しているんですが、月日が無いフォーマットは今回対応していませんが、もし対応させる必要がある場合は、適宜変更してお使いください。
最後に$format引数は、汎用性を持たせるために、どういう値で受け取るかを指定できるようにしています。
この値を指定しない場合は、年月日をハッシュで返すようにしているので、それはそれで便利に使えるかと思います。
これで、役所書類も怖くなくなりますね。
でも、いい加減こんなアホな関数を作らせないために、西暦に統一するぐらいの改革をしてもらいたいものです。
0 件のコメント:
コメントを投稿