元号が改正された場合の西暦と和暦の相互変換について [JAPAN]

Posted by on in Programming

元号改正に関する話はアプリケーションから見ると、考慮すべき点がいろいろとあるかと思います。しかしそれは個々のアプリケーションごとに前提条件等が異なりますので一律に話を進めることは難しいです。

そこでここではとりあえず西暦と和暦の変換に絞った内容を記載いたします。

Windows OS側の対応

元号が改正された場合は、Windowsでは基本的にはレジストリへの新しい元号の登録によって対応します。Delphi/C++BuilderはOSの機能やAPIを使っており、暦の処理に独自の実装を行なってはいません。

レジストリ設定に関するマイクロソフトのドキュメントは以下のようなものがあります。
https://msdn.microsoft.com/en-us/library/windows/desktop/ee923790.aspx?f=255&MSPPError=-2147217396

これに基づくと、たとえば 2017年1月1日から元号が “改元” に変わるという設定は以下のように書けます。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras]
"2017 01 01"="改元_改_Kaigen_K"

この設定の結果は PowerShell 上から以下のように実行することでも確認できます。

$CultureInfo = New-Object system.Globalization.CultureInfo("ja-JP");
$CultureInfo.DateTimeFormat.Calendar = New-Object System.Globalization.JapaneseCalendar
$CurrentDate = Get-Date
$CurrentDate.ToString("ggyy年MM月dd日",$CultureInfo)

このようにレジストリだけで新しい元号に対応できるので、改元の際には Windows Update によって新しい元号の情報が追加されるものと思われます。

上記レジストリの値を利用可能な西暦→和暦変換

FormatDateTime, DateToStr, DateTimeToStr は上記レジストリの値を参照しての西暦→和暦変換を行います。

上記レジストリの値を利用可能な和暦→西暦変換

TFormatSettingsでShortDateFormatに元号を含む書式を指定した上で、StrToDateTImeを使えば改元後の和暦の日付を西暦に変換できます。

var
 JPNEraFormat: TFormatSettings;
 strDate: String;
 timestamp: TDateTime;
begin
 strDate := '改元1年1月19日';
 JPNEraFormat := TFormatSettings.Create('ja-JP');
 JPNEraFormat.ShortDateFormat := 'ggee/m/d';

 strDate := StringReplace(strDate, '年', '/', []);
 strDate := StringReplace(strDate, '月', '/', []);
 strDate := StringReplace(strDate, '日', '', []);

 timestamp := StrToDate(strDate,JPNEraFormat);
end

日付の文字列に年、月、日を含む場合は / に置換するなどの前処理が必要なことに注意が必要です。

なお、VarToDateTime で和暦→西暦変換を実装しているケースもあるかと思いますが、この関数は前述のレジストリを参照していません。改正後の元号を用いた日付を渡すと例外が発生します。ただしVarToDateTime の機能はOS側の機能ですから、Windows Update によって対応がなされる可能性はあります。

いずれにせよ、元号改正に関する話は2017年春の通常国会で法整備が進むものと考えられますので、その状況を見守りつつ、元号改正のために必要なユースケースの洗い出しを進めることが必要と考えられます。



About
Gold User, No rank,
Sales Consultant at Embarcadero Technologies, in Japan.

Comments

Check out more tips and tricks in this development video: