【保存版】令和に対応!和暦↔西暦変換をPHP、JavaScript、Pythonで実行する方法

さてさて、早いもので今年もお正月を迎えてから早3ヵ月が過ぎてしまったな〜なんて考えていたら、もっと大きな節目である「新元号の開始」まであと1ヵ月になっていてホントに時間がすぎるのは早いなと感じる今日この頃です。

しかも、我々システム関連のお仕事をしている人間にとっては元号が変わる節目より1ヵ月前、つまり新元号の発表という一大イベントはもうすぐそこになりました。

ということで、今回はそんな新元号の発表を先取りして「和暦→西暦」「西暦←和暦」の変換を以下3つの言語で実現するプログラムを紹介することにしました。

  • PHP
  • JavaScript(Node.js)
  • Python(ver 2 & 3)

ぜひみなさんの残業が減れば嬉しいです(笑)

※ご注意: この記事は新元号発表の前に執筆されたものです。そのため、発表があってから記事内の「新元号」という部分を変更します。 「令和」へ変更しました!

PHPで和暦 ↔ 西暦

PHPで西暦 → 和暦

// 西暦 => 和暦
function wareki($year) {

    $eras = [
        ['year' => 2018, 'name' => '令和'],
        ['year' => 1988, 'name' => '平成'],
        ['year' => 1925, 'name' => '昭和'],
        ['year' => 1911, 'name' => '大正'],
        ['year' => 1867, 'name' => '明治']
    ];

    foreach($eras as $era) {

        $base_year = $era['year'];
        $era_name = $era['name'];

        if($year > $base_year) {

            $era_year = $year - $base_year;

            if($era_year === 1) {

                return $era_name .'元年';

            }

            return $era_name . $era_year .'年';

        }

    }

    return null;

}

echo wareki(2000); // 平成12年

PHPで和暦 → 西暦

// 和暦 => 西暦
function seireki($wareki_year) {

    $wareki_year = str_replace('元年', '1年', mb_convert_kana($wareki_year, 'n'));

    if(preg_match('!^(明治|大正|昭和|平成|令和)([0-9]+)年$!', $wareki_year, $matches)) {

        $era_name = $matches[1];
        $year = intval($matches[2]);

        if($era_name === '明治') {

            $year += 1867;

        } else if($era_name === '大正') {

            $year += 1911;

        } else if($era_name === '昭和') {

            $year += 1925;

        } else if($era_name === '平成') {

            $year += 1988;

        } else if($era_name === '令和') {

            $year += 2018;

        }

        return $year .'年';

    }

    return null;

}

echo seireki('平成元年'); // 1989年

JavaScript(Node.js)で和暦 ↔ 西暦

JavaScript(Node.js)で西暦 → 和暦

// 西暦 => 和暦
function wareki(year) {

    var eras = [
        {year: 2018, name: '令和'},
        {year: 1988, name: '平成'},
        {year: 1925, name: '昭和'},
        {year: 1911, name: '大正'},
        {year: 1867, name: '明治'}
    ];

    for(var i in eras) {

        var era = eras[i];
        var baseYear = era.year;
        var eraName = era.name;

        if(year > baseYear) {

            var eraYear = year - baseYear;

            if(eraYear === 1) {

                return eraName +'元年';

            }

            return eraName + eraYear +'年';

        }

    }

    return null;

}

console.log(wareki(2000)); // 平成12年

JavaScript(Node.js)で和暦 → 西暦

// 和暦 => 西暦
function seireki(warekiYear) {

    var matches = warekiYear.match('^(明治|大正|昭和|平成|令和)([元0-90-9]+)年$');

    if(matches) {

        var eraName = matches[1];
        var year = parseInt(matches[2].replace(/[元0-9]/g, function(match){

            if(match === '元') {

                return 1;

            }

            return String.fromCharCode(match.charCodeAt(0) - 65248);

        }));

        if(eraName === '明治') {

            year += 1867;

        } else if(eraName === '大正') {

            year += 1911;

        } else if(eraName === '昭和') {

            year += 1925;

        } else if(eraName === '平成') {

            year += 1988;

        } else if(eraName === '令和') {

            year += 2018;

        }

        return year +'年';

    }

    return null;

}

console.log(seireki('平成元年')); // 1989年

Python(ver 2 & 3)で和暦 ↔ 西暦

Python(ver 2 & 3)で西暦 → 和暦

# coding: utf-8

# 西暦 => 和暦
def wareki(year):

    eras = [
        {'year': 2018, 'name': '令和'},
        {'year': 1988, 'name': '平成'},
        {'year': 1925, 'name': '昭和'},
        {'year': 1911, 'name': '大正'},
        {'year': 1867, 'name': '明治'}
    ]

    for era in eras:

        baseYear = era['year'];
        era_name = era['name'];

        if year > baseYear:

            eraYear = year - baseYear;

            if eraYear == 1:
                return era_name +'元年';

            return era_name + str(eraYear) +'年';

    return null;

print(wareki(2000)) # 平成12年

Python(ver 2 & 3)で和暦 → 西暦

ご注意:

全角数字が入ってくることも想定しているためjaconvを使って全角数字 → 半角数字へ変換するスクリプトを追加しています。以下のコマンドでインストールしてから実行してください。

pip install jaconv

また、このスクリプトはPython 2Python 3どちらでも実行できるようになっています。

# coding: utf-8

import re
import jaconv
import sys

# 和暦 => 西暦
def seireki(warekiYear):

    pattern = re.compile('^(明治|大正|昭和|平成|令和)([元0-90-9]+)年$')
    matches = pattern.match(warekiYear);

    if matches:

        era_name = matches.group(1)
        year = matches.group(2);

        if year == '元':
            year = 1
        else:
            if sys.version_info < (3, 0):
                year = year.decode('utf-8')
            year = int(jaconv.z2h(year, digit=True))

        if era_name == '明治':
            year += 1867
        elif era_name == '大正':
            year += 1911
        elif era_name == '昭和':
            year += 1925
        elif era_name == '平成':
            year += 1988
        elif era_name == '令和':
            year += 2018

        return str(year) +'年'

    return null;

print(seireki('平成元年')) # 1989年

ちなみに

私は数年前から Wafu という「日本に関連するデータ取得、変換」PHPパッケージを公開しているのですが、この中でも和暦と西暦の変更をするメソッドを用意しています。

もちろん新元号が発表されたらすぐにこのパッケージも更新しますので、安心して使ってください。(ちょっとした宣伝でした ^^)

ということで、今回は和暦と西暦の変換に関する話題でした。
いつでも使えるように、ぜひブックマークしておいてくださいね。

ではでは〜!