PowerShellで西暦から和暦を求める方法

プログラミングやスクリプト作成の際、「西暦の年月日」を「和暦」に変換したい場面は意外と多くあります。

特に日本国内向けの帳票やログ出力では「令和○年○月○日」という形式が求められることも少なくありません。

本記事では、PowerShellを使って簡単に西暦から和暦を取得する方法を、初級者向けにステップ・バイ・ステップで解説します。

前提条件

  • Windows PowerShell 5.1 以上(PowerShell Core 6 以降でも可)
  • .NET Framework 4.6 以上(Windows PowerShellの場合は標準搭載)
  • 基本的な PowerShell のコマンドレット(Get-Date/変数/関数)の使い方

和暦とは?

日本では歴史的に、「明治」「大正」「昭和」「平成」「令和」といった元号を用いて年を表記してきました。

  • 明治:1868年(M1)~1912年(M45)
  • 大正:1912年(T1)~1926年(T15)
  • 昭和:1926年(S1)~1989年(S64)
  • 平成:1989年(H1)~2019年(H31)
  • 令和:2019年(R1)~現在

プログラムで自動判定するには、.NETに標準で備わるSystem.Globalization.JapaneseCalendarクラスを利用する方法と、自前で開始日をマッピングする方法があります。


方法1:.NETのJapaneseCalendarを使う

PowerShellは .NET 上で動作しているため、[System.Globalization.JapaneseCalendar]を活用できます。以下は関数化したサンプルです。

function Get-Wareki {
    param(
        [Parameter(Mandatory=$true)]
        [datetime]$Date
    )
    # 日本語ロケールでのカレンダー情報を取得
    $culture = New-Object System.Globalization.CultureInfo("ja-JP")
    $culture.DateTimeFormat.Calendar = New-Object System.Globalization.JapaneseCalendar

    # 西暦→和暦変換
    $wareki = $Date.ToString("gg y年M月d日", $culture)
    return $wareki
}

# 実行例
Get-Wareki -Date (Get-Date "2025-04-17")
# → 令和 7年4月17日

ポイント解説

  1. CultureInfo(“ja-JP”) を生成し、その Calendar プロパティに JapaneseCalendar をセット
  2. ToString(“gg y年M月d日”, $culture) で、gg が元号略称、y が年を指します
  3. 関数にしておくと再利用が容易です

方法2:開始日を自前でマッピングする

.NETを使わず、自分で元号開始日と名称を配列やハッシュテーブルで管理する方法もあります。理解の練習にオススメです。

function Get-WarekiManual {
    param(
        [Parameter(Mandatory=$true)]
        [datetime]$Date
    )
    # 元号開始日と名称のテーブル
    $warekiTable = @(
        @{ Name="令和"; Start=[datetime]"2019-05-01" },
        @{ Name="平成"; Start=[datetime]"1989-01-08" },
        @{ Name="昭和"; Start=[datetime]"1926-12-25" },
        @{ Name="大正"; Start=[datetime]"1912-07-30" },
        @{ Name="明治"; Start=[datetime]"1868-01-25" }
    )

    foreach ($item in $warekiTable) {
        if ($Date -ge $item.Start) {
            $year = $Date.Year - $item.Start.Year + 1
            return "{0}{1}年{2}月{3}日" -f $item.Name, $year, $Date.Month, $Date.Day
        }
    }
    throw "対象外の日付です。"
}

# 実行例
Get-WarekiManual -Date (Get-Date "1990-01-01")
# → 平成2年1月1日

ポイント解説

  • テーブルは開始日順(新しい順)に並べ、最初にマッチする元号を採用
  • 計算は「対象の西暦年 − 元号開始の西暦年 + 1」
  • 自動化ライブラリを使わない「手組み」の学習に最適

演習問題

以下の演習問題を通じて、理解度をチェックしましょう。

  1. 関数化
    Get-Wareki を改良し、返り値をオブジェクト(PSCustomObject)で返すようにしてみてください。プロパティは Era(元号名), Year(元号年), Month, Day とします。
  2. バリデーション
    引数に過去(明治以前)または未来(西暦3000年など)の日付が渡された場合に、適切なエラーメッセージを出力するように修正してください。
  3. リスト出力
    任意の期間(開始日と終了日)を指定すると、その期間内のすべての日付と対応する和暦を一覧で出力するスクリプトを作成してください。

解答例

1. Get-WarekiObject 関数例

function Get-WarekiObject {
    param(
        [Parameter(Mandatory=$true)]
        [datetime]$Date
    )
    $culture = New-Object System.Globalization.CultureInfo("ja-JP")
    $culture.DateTimeFormat.Calendar = New-Object System.Globalization.JapaneseCalendar

    # フォーマット用の文字列取得
    $fmt = $Date.ToString("gg y M d", $culture).Split(" ")
    [PSCustomObject]@{
        Era   = $fmt[0]
        Year  = [int]$fmt[1]
        Month = [int]$fmt[2]
        Day   = [int]$fmt[3]
    }
}

# 動作確認
Get-WarekiObject -Date (Get-Date "2010-05-05")

2. バリデーション追加例

function Get-WarekiValidate {
    param([datetime]$Date)
    $min = [datetime]"1868-01-25"
    $max = [datetime]"3000-12-31"
    if ($Date -lt $min -or $Date -gt $max) {
        throw "日付は明治元年以降、かつ西暦3000年以前を指定してください。"
    }
    return Get-Wareki -Date $Date
}

3. 期間内一覧出力例

function Get-WarekiRange {
    param(
        [datetime]$StartDate,
        [datetime]$EndDate
    )
    if ($EndDate -lt $StartDate) { throw "終了日は開始日以降を指定してください。" }
    $current = $StartDate
    while ($current -le $EndDate) {
        $w = Get-Wareki -Date $current
        "{0} → {1}" -f $current.ToString("yyyy/MM/dd"), $w
        $current = $current.AddDays(1)
    }
}

# 例:2025/04/17~2025/04/19 の和暦を一覧
Get-WarekiRange -StartDate (Get-Date "2025-04-17") -EndDate (Get-Date "2025-04-19")

まとめ

  • .NET標準のJapaneseCalendar を使うと最も簡単
  • 自前マッピング は学習効果が高い
  • 関数化やエラーチェック、オブジェクト返却などでスクリプトがより安全・再利用可能に

ぜひこの記事で学んだ技術をプロジェクトに活用し、PowerShellライフをさらに充実させてください。