適材適所

PowerShellを中心にプログラミングやシステム管理の備忘録的なブログ

PowerShellで和暦を扱う

令和の喧騒

2019年5月1日に日本の元号が変わりました。

当時の世間は令和一色といった感じでメディアでも令和初、などと言った話題が尽きませんでしがた、システム界隈では改元対応など、何かと苦労された方も多いのではないでしょうか。

これを機に「うちのシステムも和暦表記はやめて西暦で統一しよう」なんてところもあったかも知れません。

そうは言っても、仕事をしていく中でちょこちょこ登場してくる和暦。

パソコン上での彼らの扱い方を知り、仲良くした方が賢明のようです。

もちろんPowerShellの中でも和暦が考慮されています。

ではPowerShellの中で和暦はどのように扱われているのでしょうか。

PowerShellにおける和暦について見ていくことにしましょう。

PowerShellで和暦を扱う

いきなりですが、下記のコマンドをPowerShellで実行すると、今日の日付が和暦で表示されるかと思います。

 
#自分のPCが日本語環境なら$culture = Get-CultureでもOK
$culture = New-Object cultureinfo("ja-JP")
$culture.DateTimeFormat.Calendar = New-Object System.Globalization.JapaneseCalendar
(get-date).ToString("ggyy年M月d日", $culture)

万が一表示されない場合は・・・更新プログラムの適用が必要です。

(このブログを見る人で、この更新が適用されていないPC環境を使っているようなことはないと思いますが・・・)

PowerShellにおける和暦の管理

PowerShellでの和暦は、.NETでの和暦の管理に依存しています。

.NETとはマイクロソフトの膨大なライブラリ群のことで、.NETでの和暦は、レジストリから取得しています( .NET Framework 3.5からそのようになったようです)。

ではレジストリの中で和暦がどのように管理されているのか、PowerShellを使って確認してみましょう。

レジストリの操作もPowerShellであれば、ファイルシステム(フォルダなど)と同じ感覚で扱うことができます。

和暦に関する情報はどこにあるかと言うと、レジストリの中のこのディレクトリになります。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras

PowerShellを使って上記のレジストリを確認するにはGet-ChildItemコマンドレットを使います。

 
Get-ChildItem HKLM:\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese
#結果
Hive: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese


NameProperty
------------
Eras               1868 01 01 : 明治_明_Meiji_M
               1912 07 30 : 大正_大_Taisho_T
               1926 12 25 : 昭和_昭_Showa_S
               1989 01 08 : 平成_平_Heisei_H
               2019 05 01: 令和_令_Reiwa_R

Eras(時代)という名前の下にこのように定義されていることが確認できました。

レジストリの日付、元号を基準に令和という和暦が呼び出されていたわけですね。

見てもらうとわかるように、各元号の開始年月日や省略値などの情報が書かれています。

これらの値を書き換えれば、PowerShell(に限らず.NET環境で)で新しい元号のテスト等を行うことができます。

最もMicrosoftの方で間違いなくアップデートしてくれるのでテストしたい、という場面は少ないでしょうが・・・。

おまけ:タイの仏歴

日本の元号について見てきましたが、別の国の歴はどのように管理されているのでしょうか。

試しにタイの仏歴はどうなるのか見てみましょう。

仏歴とはお釈迦様が入滅された日を基準にする暦法のことです。

$culture = New-Object cultureinfo("th-TH")
$culture.DateTimeFormat.Calendar = New-Object System.Globalization.ThaiBuddhistCalendar
(get-date).ToString($culture)
22/9/2562 13:23:29

西暦に543を足した年が出てきました。

ちゃんと仏歴が表示されました。

さすが世界のMicrosoft。

当たり前といってしまえばそれまでなのですが、歴や言語といった細部での国際化対応は、本当にすごいなぁと関心してしまいます。

コンピュータの世界がこれほど発展できているのも、こういった細かい対応が粛々と行われているからで、改めてMicrosoft始め、関わっている人達のすごさを感じることができますね。

というわけで、ここまでお読み頂き、ありがとうございました。

参考サイト様

日本の新元号に関する Office の更新プログラム
[MS-LCID]: Appendix A: Product Behavior | Microsoft Learn
レジストリを移動する
Windows 10 レジストリの元号 - Qiita
Microsoft – クラウド、コンピューター、アプリ & ゲーム
仏歴(ぶつれき)って知ってる?タイで不思議に思った日付の書き方 | KUBOGEN