幾つかのサイトをクローリングして日付をキーにスクレイピングしていまして、和暦と西暦が混在しまくっていてめんどくさかったので、和暦を西暦に変換する関数を作りました。
初心者ながら作ってみましたが、コードも短いので使い勝手がいいかと!
#和暦→西暦に変換する JavaScript 関数
テキスト内に西暦と和暦が混在していても一気に変換できるようにしています。
function wareki2seireki(date) {
//
// 和暦が含まれていたら西暦に変換する関数
// date:string型
//
let eraName = {"明治": 1867, // 各元号の始まりの年数(0年)を定義
"大正": 1911,
"昭和": 1925,
"平成": 1988,
"令和": 2018};
reg = RegExp("(" + Object.keys(eraName).join("|") + ")([元0-90-9]+)年") // [元号]+[○年]にマッチする正規表現を作成
while(date.match(reg)){ // [元号]+[○年]にマッチするまで繰り返す
let era = date.match(reg); // 元号を抽出
let year = parseInt(era[2].replace(/[元0-9]/g, function(match){ // 全角数字を半角数字に変換、元年にも対応
if(match === '元') {
return 1;
}
return String.fromCharCode(match.charCodeAt(0) - 65248);
}));
year += eraName[era[1]]; // 和暦年数を西暦年数に変換
date = date.replace(reg, year + "年"); // 和暦を西暦に置き換え
}
return date;
}
#参考サイト
下記サイトを参考にしました。
https://blog.capilano-fw.com/?p=3307
原型はあまり残っていませんが・・・汗
こちらはPHPやPythonのコードもあります。
#追記
コメントを頂き、もっとずっと洗練された書き方を共有いただきました。
g
オプションを使ってwhileループをなくすことに関しては、そりゃそっかと思いましたが、特に全角数字を半角数字に変換する部分でindexを利用する部分は目から鱗で、こんな方法があるのかと驚きました。
あとアロー関数に対して理解が深まり、とても勉強になりました。
ぜひ上記ではなく下記のスクリプトを利用くださいw
function wareki2seireki(date) {
const eraName = {
明治: 1867,
大正: 1911,
昭和: 1925,
平成: 1988,
令和: 2018,
};
const reg =
RegExp('(' + Object.keys(eraName).join('|') + ')(元|[0-90-9]+)年', 'g');
return date.replace(reg, (_, w, n) =>
+ n.replace(/[0-9]/g, m => '0123456789'.indexOf(m)).
replace('元', '1') + eraName[w] + '年');
}