みなさんこんにちは、テラド(@terashin1226)です!
PowerShellで西暦を和暦にサクッと変換する方法をお伝えしています。
前回は、関数やエイリアスが登録されるドライブという領域についてご説明しました。
今回から西暦を和暦にサクッと変換する関数を作っていきますよ!
elseifステートメントを使って日付の元号を特定する方法をお伝えします。
それではいってみましょう!
前回のおさらい
PowerShellをコンソール上からサクッと西暦を和暦に変換する方法を以下のステップでお伝えしています。
- 関数を短い名前で呼び出せるエイリアスについて ← 説明済
- 関数とエイリアスをいつでも呼び出し可能にするプロファイルについて ← 説明済
- 西暦を和暦へ変換する関数を作成する ← 今回説明
- 完成した関数とそのエイリアスをプロファイルに登録する
前回までにエイリアスとプロファイルを使い、コンソールからいつでも関数を呼び出せる方法をマスターしました。
いよいよ今回から西暦を和暦に変換する関数の中身を作っていきますよ!
西暦を和暦に変換する方法
コンソールから入力された西暦の日付(例:1930/1/1)を和暦(例:昭和5年1月1日)に変換する関数を作ります。
元号とその開始年月日(西暦)は以下の通りです。
元号 | 開始年月日(西暦) |
---|---|
明治 | 1868/9/8 |
大正 | 1912/7/30 |
昭和 | 1926/12/25 |
平成 | 1989/1/8 |
これらの日付を使えば、なんとなく和暦が計算できそうですよね。
元号を判定する
元号を判定するには日付が以下のどの範囲にあるのかを判定すればOKです。
変換対象の西暦の日付を「1930/1/1」とします。
この日付は昭和の開始日「1926/12/25」~平成の開始日「1989/1/8」の間にある→「昭和」と判定できますね。
和暦を計算する
続いて和暦の計算方法です。
元号が昭和と判定できたら、昭和の開始年1926から対象日付1930まで何年間かを計算すればOKです。
1930 – 1926 + 1 = 5年
つまり正解は「昭和5年」になります。
関数の処理の流れはここまで見てきたとおり
「元号の開始日と対象の日付を比較し、元号を判定」→「判定できた元号の開始日を、対象の日付から引いて、さらに1を足す」
となります。
まずは「元号の判定」をPowerShellで実現していきますよ。
elseifステートメントの使用方法
元号の特定には複数の条件判定が必要
日付「1930/1/1」の元号を判定する方法を見てみましょう。
まずこの日付が明治の開始日より小さいかを判定します。
「日付<明治の開始日」が成立しない場合、「日付≧明治の開始日」が成り立ちます。
次に日付が大正の開始日より小さいかを判定します。
「日付<大正の開始日」が成立しない場合、「日付≧大正の開始日」が成り立ちます。
さらに「日付<昭和の開始日」を判定します。同じことの繰り返しですがこの条件が成立しないと「日付≧昭和の開始日」となりますね。
最後に日付が平成の開始日より小さいかを判定します。「日付(1930/1/1)<平成の開始日(1989/1/8)」が成立するので「昭和」であることが判定できました。
元号の開始日が分かっていれば人間は一瞬で元号を判定できますが、コンピュータで判定するには複数の条件を判定する必要があります。
このような複数の条件を判定するにはelseifステートメントを使います。
elseifステートメントの構文
elseifステートメントの構文は以下の通りです。
if(条件式){
処理内容
}elseif(条件式){
処理内容
}else{
処理内容
}
ifの条件に合致しなかった場合には、elseifの条件式が判定され、合致すればその中の処理が実行されます。elseifはいくつでも書くことができます。
ifやelseifのどの条件にも合致しなかった場合にelseの処理が実行されます。
比較演算子
数値を比較するには比較演算子を使用します。PowerShellでは以下のような演算子があります。
比較演算子 | 意味 | 一般的な記号 |
---|---|---|
-eq | 等しい(equal) | = |
-ne | 等しくない(not equal) | ≠ |
-gt | より大きい(greater than) | > |
-ge | 以上(greater or equal) | ≧ |
-lt | より小さい(less than) | < |
-le | 以下(less or equal) | ≦ |
少し癖がありますね。
elseifで日付の範囲毎に処理を分ける
では実践してみましょう。
引数とする変換元の日付(西暦)は8桁の数値として表現します。比較する元号の開始日付も引数と同じく8桁の数値としてあらかじめ変数に用意しておきます。
また明治以前の日付の場合は「明治以前の日付には対応していません。」とメッセージだけ表示します。
Function Ad-Conversion($indate){ $ERA_MEIJI = "明治" $ERA_TAISYOU = "大正" $ERA_SYOUWA = "昭和" $ERA_HEISEI = "平成" $DATE_MEIJI = 18680908 $DATE_TAISYOU = 19120730 $DATE_SYOUWA = 19261225 $DATE_HEISEI = 19890108 if($indate -lt $DATE_MEIJI){ Write-Host("明治以前の日付には対応していません。") }elseif($indate -lt $DATE_TAISYOU){ Write-Host("元号は" + $ERA_MEIJI + "です。") }elseif($indate -lt $DATE_SYOUWA){ Write-Host("元号は" + $ERA_TAISYOU + "です。") }elseif($indate -lt $DATE_HEISEI){ Write-Host("元号は" + $ERA_SYOUWA + "です。") }else{ Write-Host("元号は" + $ERA_HEISEI + "です。") } } Ad-Conversion 19300101
ISEで入力して、sample.ps1という名称で保存して実行してみます。
正しく元号が表示されましたね!
まとめ
いかがだったでしょうか。
今回はelseifステートメントで日付の範囲を判定し、元号を特定する方法をお伝えしました。
あとは日付から年だけ取り出し和暦を算出すれば関数の完成です。
次回はDatetimeという型を使い日付から年を取り出す方法をお伝えし、西暦和暦変換の関数を完成させたいと思います!
最後までお読みいただきありがとうございました!