Help us understand the problem. What is going on with this article?

令和へ対応せよ!元号のアルゴリズム

More than 1 year has passed since last update.

令和へ対応せよ!

2019年05月01日より元号は平成から令和へと変わります。
ですが悲しいかな、荒く組まれたシステムの中には元号が平成しか想定されていないものが…。
そんな可愛そうなプログラムを令和を感じることが出来るようにさせてあげましょう!

ちなみにこの記事のプログラミング言語はjavaScriptです。
しかし仕組みはどの言語でも通用すると思います。

そもそもどうやって元号を判別する?

今回は昭和平成令和を判別出来るプログラムを組んでいきます。
問題はどうやって判別するのか?という所です。

元号の定義を知ろう。

昭和は1926年12月25日から1989年01月07日(昭和61年)。
平成は1989年01月08日から2019年04月30日(平成31年)。
令和は2019年05月01日から~~~。
となります。

ということは…?

今の西暦の日付と元号の定義を比較すれば判別出来そうですね。
雑に頭の中に浮かぶのは

//判別したい日付の定義。
const now_year=2019,
      now_month=4,
      now_day=1;

//年・月・日を全て比較する。
if(1926>=now_year && now_year<=1989 && now_month>=12 && now_month<=1 && now_day>=25 && now_day<=7){
  console.log(`昭和`);
}

のような感じ。
なるほど、年・月・日をそれぞれ比較する感じにしてますね。
が、流石にこれはガバガバです。
now_month>=12 && now_month<=1とか冷静に考えなくてもバグバグの実の能力者かな?って感じですね。

じゃぁじゃぁ…

じゃぁもっと繊細なプログラミングをしてみましょうか。

//判別したい日付の定義。
const now_year=2019,
      now_month=4,
      now_day=1;

//まずは年の比較
if(1926<=now_year && now_year<=1989){
  //次に特定の西暦の場合の月・日の比較。
  if(now_year==1926){
    if(now_month>=12 && now_day>=25){
      console.log(`昭和`);
    }
  }else if(now_year==1989){
    if(now_month<=1 && now_day<=7){
      console.log(`昭和`);
    }
  }else{
    console.log(`昭和`);
  }
}

こんな感じに組み上がりました。
これで昭和が判別出来るはずです。
…でもなんかスマートじゃない気がしませんか?
まぁ日本独自の仕組みだし、こんなものかな…。

Youのプログラムは無駄が多いZE!

と頭の中のメリケンが煽ってきます。
いけません、もっとクールにジャパンのシステムをビルドしなくては!
実はいい方法があるんです。

//判別したい日付の定義。
const now_year=2019,
      now_month=4,
      now_day=1;

//西暦の計算(結果20190401)
const now_ad=now_year*10000+now_month*100+now_day;

//西暦の比較
if(19261225<=now_ad && now_ad<=19890107){
  console.log(`昭和`);
}

仕組みは割と単純で
年・月・日を年*10000+月*100+日と計算することで
西暦のYYYYMMDDが求められます。
あとはその西暦を元号の期間と比較するだけです。

使ったif文は1つだけ!
比較演算子も2つしか使っていません!!
クール!!!

出来上がったプログラムがこちら。

//判別したい日付の定義。
const now_year=2019,
      now_month=4,
      now_day=1;

//西暦の計算(結果20190401)
const now_ad=now_year*10000+now_month*100+now_day;

//元号の判別。
if(19261225<=now_ad && now_ad<=19890107){
  console.log(`昭和`);
}else if(19890108<=now_ad && now_ad<=20190430){
  console.log(`平成`);
}else if(20190501<=now_ad){
  console.log(`令和`);
}else{
  console.log(`異常`);
}

これで令和の次の元号が発表されても簡単に対応出来るプログラムが書き上がりました。

まぁ他にも良い方法はあると思う。

今回は暗に
・年と月と日の整数値だけがある。
・時間を処理できる関数を使わない。
でプログラミングしてました。

実際は色んな便利な関数があるはずなので、その言語に合わせて実装してみてください。

後は、現在の西暦YYYYに元号の始まりのYYYYを引き算すると年度が求められたりするので
頑張って新元号に対応してください。

編集後記

入社12日目。
平成から令和への修正案件をやったので書きました。
まぁグーグルIMEですら「れいわ」と打って「令和」に変換できないので焦る必要ないと思います笑
「れい」と打って「令」を、そして「わ」と打って「和」を…
なんだか日本の生産効率性って一周回って笑えます。

s4kd0R
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away