(このTipsは令和元年5月に公開したものです)
今回は日付表示に和暦を使用しているシステムで、新元号「令和」に対応させる方法をご紹介します。
最新OSでは対応不要
Delphiでは日付表示においてOSの機能やAPIを使っており、暦の処理に独自の実装を行っていません。
そのため、Windows 10 / Server 2016 / 8.1 / Server 2012 R2 / Server 2012 / 7 SP1 / Server 2008 R2 SP1 / Server 2008 SP2 では、最新のWindows Updateを適用することで「令和」に対応します。
Windows 7以降で、Windows Update未適用時
Windows 7以降は、レジストリキーの追加でも令和を使用できます。
上記の最新OSにおいても、意図的にWindows Updateを適用していない場合は、レジストリエディタで以下のキーを追加して下さい。
- レジストリキー:『HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras』
- 値の名前:『2019 05 01』
- 値のデータ:『令和_令_Reiwa_R』
Windows XP以前などの古いOS
※2023年追記:
DelphiおよびDelphi/400 11 Alexandria以降でコンパイルされたアプリケーションは、
Windows XP以前のOSで起動することができません。
日付から文字列への変換には、TDateTime型を形式化するFormatDateTime関数がよく使用されます。
TDateTime型は、実際には整数部に日付、小数部に時刻を保持するDouble(実数)型の一種で、
2019年5月1日を実数に変換した「43586」という数値によって
対象日付が2019年5月1日以降かどうかを判別できます。
プログラム修正で和暦を令和と表示させる例を以下にご紹介します。
システムの統制上Windows Updateを適用できない場合や、
上記以外のMicrosoftがサポートしていない古いOSの場合にご利用ください。
// 修正前(※wdayはTDateTime型) ShowMessage(FormatDateTime('gge/m/d', wday)); // 修正後(例) if (wday >= 43586) then // 2019年5月1日~ begin iEE := StrToInt(FormatDateTime('yyyy', wday)); ShowMessage('令和' + IntToStr(iEE - 2018) + '/' + FormatDateTime('m/d', wday)); end else // ~2019年4月30日 ShowMessage(FormatDateTime('gge/m/d', wday));
TDateTime型の変数の値が43586(2019年5月1日)以上の場合、その変数を年と月日に分割し、年部分を「”令和”」+「西暦年-2018」と表記することで対応します。
2019年を令和1年ではなく「令和元年」と表示させたい場合は、StringReplace関数を使う、年部分が2019かどうかで表記を変える、といった独自のロジックで実装して下さい。
(ミガロ.情報マガジン「MIGARO News!!」Vol.220 2019年5月号より)