Author: Shinji Chikugi
注:本記事は2018年4月時点の情報に基づきます。
新元号「令和」への改元に伴う様々な留意点は経済産業省のウェブページ 改元に伴う企業等の情報システム改修等への対応 に掲載の情報もご確認ください。また Windows アプリケーションの挙動は Windows Update の適用状況に影響を受けるため、マイクロソフト社のウェブページ 新元号への対応について もご確認ください。
Table of Contents
はじめに
平成からの改元が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を配置して日付を変換してみます。コードは以下となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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には元号の情報が配列として格納されていますので、これをコンボボックスに設定します。
1 2 3 4 5 6 7 8 9 10 11 |
__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); } } |
続いて、和暦から西暦への変換処理です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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の改元対応は準備が完了しています。
むしろ、システム側の要件定義などでユースケースの洗い出しが必要となります。例えば、金融系などでは帳票の契約期間などで「リース期間は、平成XX年XX月XX日から平成XX年XX月XX日までのXX年間とする。」というように、和暦の未来日を扱うケースがあります。
和暦から西暦の換算、あるいは、その逆を自前でコーディングしていませんか?日付換算はランタイムライブラリにて用意しています。今のうちにコードの見直しを行い、予期せぬバグの発生を事前に予防しておきましょう。
本記事のソースコードは以下のURLにて公開してあります。
https://github.com/schikugi/NewEraTest
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition