Windowsのポチポチ業務を爆速化するPowerShell、日付を操るDatetime型


みなさんこんにちは、テラド(@terashin1226)です!

PowerShellで西暦を和暦にサクッと変換する方法をお伝えしています。

前回はelseifステートメントで日付の元号を判定する方法をご説明しました。

Windowsのポチポチ業務を爆速化するPowerShell、elseifで日付の元号を判定する方法
Windowsのポチポチ業務(マウスを使った業務)を爆速化するPowerShell。今回はelseifステートメントを使って与えられた日付の元号を判定する方法をお伝えします!

今回はPowerShellで日付を扱うDatetime型についてお伝えします。Datetime型を使って日付から「年」だけを取り出し和暦を計算し、西暦を和暦に変換する関数を完成させますよ!

それではいってみましょう!

スポンサーリンク

前回のおさらい

PowerShellをコンソール上からサクッと西暦を和暦に変換する方法を以下のステップでお伝えしています。

  • 関数を短い名前で呼び出せるエイリアスについて ← 説明済
  • 関数とエイリアスをいつでも呼び出し可能にするプロファイルについて ← 説明済
  • 西暦を和暦へ変換する関数を作成する ← 今回さらに説明
  • 完成した関数とそのエイリアスをプロファイルに登録する ← 今回説明

前回は複数条件の判定ができるelseifステートメントをご紹介し、元号の判定をするスクリプトが完成しました。

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 + "です。")
 
    }
}

「明治より前?」(if)

→「いいえ。」

「じゃあ大正より前?」(elseif)

→「いいえ。」

「じゃあ昭和より前?」(elseif)

→「はい」

「じゃあ元号は大正だね!」

というようにelseifステートメントで複数の条件を判定し、元号を判定することができました。

このスクリプトでは、比較の際に日付を8桁の数字として扱いました。

    $DATE_MEIJI = 18680908 

今回はPowerShellで日付同士の大小比較ができるDatetime型という変数の型をご紹介します。Datetime型は日付から年・月・日を取り出すこともでき、日付を扱うのに非常に便利なんです!

変数の型とは

Datetime型の前に「変数の型」をご説明します。

変数はデータを一旦入れておく箱のような役割を持ちますが、変数の型はその箱にどんな種類のデータを入れられるかを示します。

これまで数値はそのまま代入、文字列はダブルコーテーションで囲って代入していましたよね。

$num1 = 1
$num2 = 5.5
$str = ”これは文字列です"

PowerShellでは代入した値によって「型」を自動で設定してくれる機能があります。

実際に型を確認してみましょう。

GetTypeで型を確認する

型を確認するにはGetTypeという機能を使います

変数の後にドット「.」をつけてGetType()と書けばOKです。

変数.GetType()

コンソールでの代入が終わったら

GetType()を実行します。

「Name」に表示された「Int32」「Double」「String」が変数の型です。代入した値によって変数の型が変わっていますね

変数の型には以下のような種類があります。

説明
Int32 整数
Double 実数(小数点を含む数)
String 文字列
Datetime 日付

Datetime型の変数を作成する

変数の型を理解したところで、Datetime型の変数を作ります。

Datetime型に値を代入するとき年・月・日の3つは必須です。3つを「/」(スラッシュ)か「-」(ハイフン)で区切り、「”」(ダブルコーテーション)で囲って代入します。

$date = "2019/5/5"

型の確認をしてみると…

あれ!文字列の型であるString型になってしまいました…

数値(整数と実数)や文字列と違い、Datetime型を使用するには、そのことを宣言する必要があります。

型を宣言する方法

[型名]を変数の前に書けば、型を宣言できます

[型名]$変数名 = 値

$dateという変数であれば以下のようになります。

[Datetime]$date = "2019/5/5"

コンソールで入力し、GetTypeを実行すると…

Datetime型になりました!

変数$dateをコンソールで入力すると…

日付の形式で表示されていますね!

でも、代入していない時刻「0:00:00」まで設定されています。Datetime型は年月日と時刻で成り立ちます。時刻を加えたい場合は日付の後ろに半角スペースを空けて「”yyyy/mm/dd 00:00:00″」形式で入力すればOKです。

Datetime型で「年」だけ取り出す

Datetime型の変数では、Year・Month・Day・Hourなど日付の必要な情報だけ取り出せます。

変数名の後ろにドット「.」を付けて「Year」と指定すると年だけを取り出せます

変数名.Year

月の場合は「Month」、日の場合は「Day」、時刻の場合は「Hour」を指定します。

変数$dateの「年」を取り出してみましょう。

$date.Year

コンソールで実行してみると…

年=「2019」だけが表示されました!

Datetime型を使って西暦を和暦に変換するスクリプト

Datetime型を使って前回のスクリプトを修正します!

Datetime型でスクリプトを書き換える

前回作成したスクリプトは以下の通りです。

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 + "です。")
 
    }
}

1行目~11行目の引数$indateと元号の開始日をDatetime型に指定し、日付の形式のまま大小比較ができるようにします。


Function Ad-Conversion([Datetime]$indate){

    $ERA_MEIJI = "明治"
    $ERA_TAISYOU = "大正"
    $ERA_SYOUWA = "昭和"
    $ERA_HEISEI = "平成"

    [Datetime]$DATE_MEIJI = "1868/9/8"
    [Datetime]$DATE_TAISYOU = "1912/7/30"
    [Datetime]$DATE_SYOUWA = "1926/12/25"
    [Datetime]$DATE_HEISEI = "1989/1/8"

日付が「明治の開始日」より前の場合、15行目で「明治以前の日付には対応していません。」とメッセージを表示していますが、結果出力は不要なのでその後すぐにexitという命令で関数を強制終了します。

        Write-Host("明治以前の日付には対応していません。")
        exit

元号が判定された後、日付から「年」だけ取り出し「(入力された日付の年) – (元号の開始日の年) + 1」と和暦を計算します。計算結果は$yearという変数に代入します。

元号が明治の場合は19行目を

$year = $indate.Year - $DATE_MEIJI.Year + 1

に書き換えます。

結果出力で使用するため、元号を変数$Eraに代入する処理を追加します。

        $ERA = $ERA_MEIJI

それぞれの元号の場合(23,27,31行目)も同様に書き換えます。

最後にelseif内で判定した元号:$ERA、計算した和暦:$year、引数:$indateのMonth・Dayを使って「元号gg年mm月dd日」形式で結果を出力します。

    Write-Host ($ERA + $year + "年" + $indate.Month +"月" + $indate.Day + "日")

最終的なスクリプトは以下の通りです。

function Ad-Conversion([Datetime]$indate){
    
    $ERA_MEIJI = "明治"
    $ERA_TAISYOU = "大正"
    $ERA_SYOUWA = "昭和"
    $ERA_HEISEI = "平成"

    [Datetime]$DATE_MEIJI = "1868/9/8" 
    [Datetime]$DATE_TAISYOU = "1912/7/30"
    [Datetime]$DATE_SYOUWA = "1926/12/25"
    [Datetime]$DATE_HEISEI = "1989/1/8"
    
    if($indate -lt $DATE_MEIJI){

        Write-Host("明治以前の日付には対応していません。")
        exit

    }elseif($indate -lt $DATE_TAISYOU){

        $ERA = $ERA_MEIJI
        $year = $indate.Year - $DATE_MEIJI.Year + 1

    }elseif($indate -lt $DATE_SYOUWA){

        $ERA = $ERA_TAISYOU
        $year = $indate.Year - $DATE_TAISYOU.Year + 1
    
    }elseif($indate -lt $DATE_HEISEI){

        $ERA = $ERA_SYOUWA
        $year = $indate.Year - $DATE_SYOUWA.Year + 1
    
    }else{

        $ERA = $ERA_HEISEI
        $year = $indate.Year - $DATE_HEISEI.Year + 1

    }

    Write-Host ($ERA + $year + "年" + $indate.Month +"月" + $indate.Day + "日")

}

New-Alias -Name "wareki" Ad-Conversion

最終行に関数「Ad-Conversion」にエイリアス「wareki」を設定しました。

エイリアスについては以下の記事をご参照ください。

Windowsのポチポチ業務を爆速化するPowerShell、短いワードでサッと関数を呼び出すエイリアスの使い方
Windowsのポチポチ業務(=マウスを使った業務)を爆速化するPowerShell。自作した関数をFunctionドライブというものに登録して、いつでも呼び出せるようにする方法をお伝えします!

プロファイルに関数を登録する

完成した関数「Ad-Conversion」とエイリアス「wareki」をプロファイルに登録します。

psedit $profile

とコンソールで入力するとISEでプロファイルが開きますので、完成したスクリプトを記載し保存します。

ISEを再起動し、以下のように関数を呼び出すと…

コンソールから西暦を和暦に変換することができました!

プロファイルについては以下の記事をご参照ください。

Windowsのポチポチ業務を爆速化するPowerShell、起動時に関数を自動登録するプロファイルの使い方
Windowsのポチポチ業務(マウスを使った業務)を爆速化するPowerShell。今回はPowerShell起動時に自動で実行されるプロファイルというスクリプトを使って、関数やエイリアスを登録する方法をお伝えします。

まとめ

PowerShellで日付を操るに便利なDatetime型についてお伝えしました!Datetime型では日付同士の比較ができます。またYear・Month・Day・Hourを指定すれば、必要な情報だけ取り出すことができます

これで西暦を和暦に変換する関数が完成しました!Datetime型の変数やプロファイル・エイリアスを活用し、みなさんも自作関数を作ってみてください!

それでは、最後までお読みいただきありがとうございました!

連載目次:Windowsのポチポチ業務を爆速化するPowerShell

Windowsのポチポチ業務(マウスを使った業務)を爆速化するために、PowerShellを使った効率化の方法をお伝えしています。
  1. Windowsのポチポチ業務を爆速化するPowerShell、はじめのハードルぐーーんと下げてみます!
  2. Windowsのポチポチ業務を爆速化するPowerShell、キーボードを使わずササっと起動する方法
  3. Windowsのポチポチ操作を爆速化するPowerShellの絶対条件!ディレクトリとその移動をマスターしよう!
  4. Windowsのポチポチ業務を爆速化するPowerShell、コマンドレットを腹の底から理解する!
  5. Windowsのポチポチ業務を爆速化するPowerShell、オンラインヘルプでコマンドレットを使い倒す!
  6. Windowsのポチポチ業務を爆速化するPowerShell、統合開発環境ISEを紹介します!
  7. Windowsのポチポチ業務を爆速化するPowerShell、スクリプトを実行するための準備
  8. Windowsのポチポチ業務を爆速化するPowerShell、フォルダを作るスクリプトの作り方
  9. Windowsのポチポチ業務を爆速化するPowerShell、if文を使いフォルダの有無で処理を分岐させる方法
  10. Windowsのポチポチ業務を爆速化するPowerShell、ForEach-Objectで配列の全要素を処理する方法
  11. Windowsのポチポチ業務を爆速化するPowerShell、パイプラインを使いコマンドレット間で値を引き渡す方法
  12. Windowsのポチポチ業務を爆速化するPowerShell、ファイルを別フォルダにコピーし名称を変更する方法
  13. Windowsのポチポチ業務を爆速化するPowerShell、ファイル名を変更する方法
  14. Windowsのポチポチ業務を爆速化するPowerShell、正規表現で複雑なファイル名変更をする方法
  15. Windowsのポチポチ業務を爆速化するPowerShell、タスクスケジューラでスクリプトを決まった日時に起動する方法
  16. Windowsのポチポチ業務を爆速化するPowerShell、ファイルをバックアップするスクリプトの作り方
  17. Windowsのポチポチ業務を爆速化するPowerShell、関数を作ってスクリプトから呼び出す方法
  18. Windowsのポチポチ業務を爆速化するPowerShell、関数をコンソールで登録して呼び出す方法
  19. Windowsのポチポチ業務を爆速化するPowerShell、短いワードでサッと関数を呼び出すエイリアスの使い方
  20. Windowsのポチポチ業務を爆速化するPowerShell、関数やエイリアス保存場所のドライブを紹介します
  21. Windowsのポチポチ業務を爆速化するPowerShell、elseifで日付の元号を判定する方法
  22. Windowsのポチポチ業務を爆速化するPowerShell、日付を操るDatetime型

タイトルとURLをコピーしました