はじめに
平成からの改元が1年後に迫りました。改元に対する皆様の準備はお進みでしょうか?Delphi/C++Builderは2018年4月現在の最新バージョンである、10.2.3 Tokyoにて新元号の対応は完了しています。
Microsoftからのアナウンスがあったように、Windows 10は次期アップデートであるSpring Creators Updateにて仮対応が済んでいます。新元号は決まっていませんが、改元日は決まっていますので、このようにレジストリに改元日の情報が追加されています。
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlNlsCalendarsJapaneseEras
では、Delphi/C++Builder 10.2.3 Tokyoではどうでしょう。過去、記事が執筆されていますが、その頃とは少々状況が変わっているので再確認しましょう。
まず、「??」では味気ないのでレジストリに新年号を「改元_改_Kaigen_K」として設定します。
西暦から和暦の変換
DelphiとVCLのアプリケーションで西暦から和暦の変換を実行してみます。
変換方法はFormatDateTimeで直接書式を指定する方法と、DateTimeToString でデフォルトのロカール(ロケール)情報を取得して変換する方法があります。
フォームにTDateTimePickerを配置して日付を変換してみます。コードは以下となります。
procedure TEraTest.Button1Click(Sender: TObject);
var
// 書式
eraFormat : TFormatSettings;
s : string;
begin
// 書式を指定して変換をする。
DateTimeToString(s, 'ggee年mm月dd日', DateTimePicker1.Date);
edtFormatDateTime1.Text := s;
// 地域情報を取得して変換をする。
eraFormat := TFormatSettings.Create(TLanguages.UserDefaultLocale);
edtFormatSettings.Text := FormatDateTime(eraFormat.LongDateFormat, DateTimePicker1.Date);
end;
アプリケーションを実行して、日付を2019年5月2日にして和暦に変換します。
書式を直接指定するDateTimeToStringでは新元号で表示されました。TFormatSettingsはWindowsのロカール情報から書式を取得しますので、Windowsの日付の表示形式を和暦にします。
同じアプリを実行します。
VCLのTDateTimePickerでも新元号が表示されます。改元日の翌日である2019年5月2日を選択して実行します。
Windowsのロカール情報を元に日付が新元号に変換されて文字列として表示されました。
和暦から西暦の変換
次は逆のケースです。FireMonkeyとC++Builderで実装してみましょう。会計や金融系のアプリケーションで良くあるUIで年号をドロップダウンリストで選択して、年、月、日をテキストで入力するUIがあります。
本来ならば、年号と年月日の関係をチェックしなければなりませんが、本記事では省略します。まず、年号一覧の取得です。フォームのコンストラクタでコンボボックスを初期化します。TFormatSettingsには元号の情報が配列として格納されていますので、これをコンボボックスに設定します。
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
TFormatSettings LocaleSettings = TFormatSettings::Create(TLanguages::UserDefaultLocale);
// 元号一覧の取得
cboEra->Items->Clear();
for (auto era : LocaleSettings.EraInfo) {
cboEra->Items->Add(era.EraName);
}
}
続いて、和暦から西暦への変換処理です。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TFormatSettings LocaleSettings = TFormatSettings::Create(TLanguages::UserDefaultLocale);
LocaleSettings.ShortDateFormat = "ggee/m/d";
std::unique_ptr<TStringBuilder> psbYMD(new TStringBuilder());
// 選択値を「ggee/m/d」の形式で文字列化
psbYMD->Append(cboEra->Items->Strings[cboEra->ItemIndex]);
psbYMD->Append(edtYear->Text);
psbYMD->Append("/");
psbYMD->Append(edtMonth->Text);
psbYMD->Append("/");
psbYMD->Append(edtDay->Text);
// 和暦から西暦に変換
TDateTime dd = StrToDate(psbYMD->ToString(), LocaleSettings);
Edit1->Text = DateTimeToStr(dd);
}
StrToDateとTFormatSettingsの書式情報で元号を含む日付が西暦に変換できます。
まとめ
このようにDelphi/C++Builderの改元対応は準備が完了しています。
むしろ、システム側の要件定義などでユースケースの洗い出しが必要となります。特に、金融系などでは、契約期間などで和暦の未来日を扱うケースが発生するなど注意が必要です。
本記事のソースコードは以下のURLにて公開してあります。
https://github.com/schikugi/NewEraTest
Read More