2019年3月25日

【PowerShell】日付を和暦表示するスクリプト


新元号発表まであと1週間となりましたが、PowerShellで日付を和暦表示するスクリプトを作ってみました。

#
# Get-WarekiDate.ps1
#

#パラメータ
Param($date, $time)

try{
    if (($date -eq $null) -And ($time -eq $null)){
        #両方nullなら現在の日付を取得
        $d = Get-Date
    } elseif (($date -ne $null) -And ($time -eq $null)) {
        #指定した日付
        $d = [System.DateTime]::Parse($date)
    } elseif (($date -ne $null) -And ($time -ne $null)) {
        #指定した日付と時刻
        $d = [System.DateTime]::Parse($date + ' ' + $time)
    } else {
        #それ以外はエラー
        Write-Output 'パラメータが間違っています。[日付] [時刻]を指定してください。'
        exit
    }

    $c = New-Object System.Globalization.CultureInfo("ja-JP", $true)
    $c.DateTimeFormat.Calendar = New-Object System.Globalization.JapaneseCalendar

    #和暦で表示
    $d.ToString("ggy年M月d日 HH:mm:ss", $c)
}
catch [System.FormatException]{
    Write-Host "日付の指定が間違っています。"
    Write-Host $_
}
catch{
    Write-Host $_
}
少し解説すると、まず、下準備としてCultureInfoクラスで"ja-JP"のインスタンスを作成し、カレンダーを和暦(JapaneseCalendarクラス)に置き換えます。そして、DateTimeオブジェクトのToStringで、第2引数にCultureInfoクラスのインスタンスを指定すれば和暦として表示されます。

Windowsでは和暦情報を下記のレジストリを使って管理しているのですが、PowerShellで和暦表示させる場合もこの情報を取得してきています。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras
PS C:\work\PowerShell> Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras


1868 01 01   : 明治_明_Meiji_M
1912 07 30   : 大正_大_Taisho_T
1926 12 25   : 昭和_昭_Showa_S
1989 01 08   : 平成_平_Heisei_H
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese
PSChildName  : Eras
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry
ここには元号が始まった日と表記方法が格納されています。
おそらく4月1日以降マイクロソフトから更新プログラムが公開され、平成の下に新元号のデータが追加されることになると思います。


では、実際に表示させてみます。

PS C:\work\PowerShell> .\Get-WarekiDate.ps1
平成31年3月25日 21:54:10
パラメータに何も指定しない場合は、現在の日時が和暦表示されます。

PS C:\work\PowerShell> .\Get-WarekiDate.ps1 1980/3/25
昭和55年3月25日 00:00:00
パラメータに日付を指定すると、指定した日付が和暦表示されます。

PS C:\work\PowerShell> .\Get-WarekiDate.ps1 1912/7/30 22:32
大正1年7月30日 22:32:00
パラメータに日付と時刻を指定すると、指定した日時が和暦表示されます。


4月1日、どんな元号となるのか楽しみです。


<参考>
西暦と和暦を変換するには?:.NET TIPS - @IT
アプリケーションの新元号対応 | Microsoft Docs
DateTime.ToString Method (System) | Microsoft Docs
CultureInfo Class (System.Globalization) | Microsoft Docs
JapaneseCalendar Class (System.Globalization) | Microsoft Docs