改元絡みでWindows 10の電卓アプリがバグってました

Windows 10の電卓アプリは日数の計算機能があるが
改元が挟まると表示がおかしくなる?

どうも30年に1回くらいしか発見する機会がないバグを見つけてしまったのかもしれない。

Windows 10付属の電卓アプリには、「日数の計算」という機能があるが、Windowsのカレンダー表示を和暦にして、改元の日を挟んで日数計算すると特定条件下で日付計算を間違う。

最初に筆者は、新元号のテストで発見したのだが、実は新しい元号とは関係なく、昭和と平成の切り替わりタイミングでも同じように計算を間違っていた。和暦にして改元を挟んでテストしないと見つけられないバグなのである。

平成になったのは1989年のことが、このときのWindowsは2.1(ただし日本語版は平成になってから発売)で、Windows 10の付属ソフトウェアとして登場した電卓プログラムは当然存在していなかった。和暦表示が可能なWindowsは、筆者の記憶ではWindows 2000あたりから。Windows NT 4.0でどうだったかは記憶に無いのだが、Windows 2000やXPでは設定した記憶がある。

今年5月から、新しい元号(以下、新元号)になる。Windowsには、すでに複数の元号を扱う機能があるが、肝心の新元号が発表されていないため、現在のWindows 10 Ver.1809では、2019年は年末まで「平成31年」と表示される。

Windowsはアプリケーションに対してさまざまなAPIを提供しているが、日付データを書式指定して人間が読める文字列に変換するのもその1つ。この機能は、現在では西暦だけでなく元号を含む和暦を扱うことができる。

この日付表示機能は、アプリ側が書式のパターンを指定して文字列に変換することもある。イメージ的には、Excelの日付の書式設定のような感じである。ただ、こうした処理はお決まりのパターンもあるので、標準的な形式(長い形式と短い形式がある)で変換した文字列をもらうといったやり方もできる。

単に日付を表示するようなアプリでは、この方法で日付を表す文字列を得るが、同一の日付でもWindows側の設定により違った文字列が来る。たとえば文字列の表示場所を英語の場合で確保しておくと、和暦になったときに文字列がはみ出すといった問題が起きることがある。あるいは、もらった文字列がアルファベットのみと仮定して加工処理してしまい、複数バイト文字の途中で切っちゃうなんてことも起こりえる。

ただし、Windows 10の標準では、日付を西暦で表示するようになっているため、多くのアプリは日付を和暦では表示しない。これは、設定で変更可能だ。

Windows 10でも設定の変更で和暦表示が可能

設定アプリから「時刻と言語」→「地域」→「データ形式を変更する」→「カレンダー」で「和暦」を選択する。

これにより、たとえば、タスクバー右端の時計表示の日付や、カレンダーアプリなどが日付を元号を持つ和暦で表示するように切り替わる。

ただし、アプリによっては、設定後に再度起動しないと切り替わらない場合もある。このことで切り替わるアプリは、WindowsのAPIを利用して日付を表示していることがわかる(切り替わらないからといってWindowsの日付関連の機能を使っていないわけではない)。

デフォルトになっていないのは、たとえば英語圏で「世界のすべてはASCIIコード」と思い込んで作られたアプリケーションなんかが、エラーを起こす可能性があるからだ。

基本的に今のWindowsでは、アプリケーションのエラーがシステムクラッシュを引き起こすことはないため、致命的な問題になることはないが、必ずしも想定通りにいかないのが世の中の常である。

レジストリの追加で新元号を設定可能
すでに準備はできているようだ

Windowsには元号に対応する基本的な仕組みがあるので、レジストリを設定することで、新元号が有効になり今年の5月1日以降に新元号を表示できるようになる。具体的には、

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

に、新元号の開始日を名前として、元号名や略称をデータとする文字列値を書き込む。

たとえば、

"2019 05 01" = 新元号名+"_"+元号略称(1文字)+"_"+元号ローマ字表記+"_"+元号ローマ字頭文字

とする。"_"は、半角のアンダーバー文字である。ただ、現時点では新元号名は不明なので、この設定項目は入っていない。たとえば、新元号が「■■」とすると、

"2019 05 01"="■■_■_Shikaku_Q"

となる(正式に発表されると、ここに元号が登録されるのだろう)。

これで、前述の設定にあるカレンダーの表示を和暦にして、5月1日以降の日付を表示させると新元号となる。たとえば、カレンダーアプリで、今年5月を表示させると「■■元年5月」となった。

なお、今回の新元号の更新に合わせ、「1年」を「元年」と表示する機能が追加で組み込まれている。ただし従来は数字であった月の表示が漢字に変わると、問題を起こすアプリケーションが存在する可能性を考慮して、この元年機能はオフにもできる。これもレジストリを使って以下のように設定する。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\
名前:InitialEraYear
種類:文字列値(REG_SZ)
データ:
"1年" 最初の年を1年と表示
"元年" 最初の年を元年と表示(デフォルト値)

これらの設定を使い、さまざまなアプリケーションを動かしてみる。これで、アプリケーションが新元号のアップデートに耐えられるかどうかがわかる。たとえば、タスクバーの時計だが、和暦表示にして新元号の表示には対応するが元年表示には対応していないようだ。

さて、問題の電卓アプリだが、Windowsの表示を和暦にすると、「日付の計算」の表示も和暦になる。ただし、元年表示には対応していない。これで、開始日として「平成31年4月2日」(2019年4月2日)を、終了日として「■■01年5月1日」(2019年5月1日)を選択すると正しく「4週,1日(29日)」と表示するが、開始日を「平成31年4月1日」とすると、その差を「1年」と表示してしまう。日数としては30日になっているので計算は正しいものの、表示の方が間違っているようだ。

最初は、新元号関連のアップデートでバグったのかと思ってたが、新元号の設定とは無関係に昭和と平成の切り替わりでも同じように表示を間違う。

つまり元号処理に関連してのエラーだったのである。しかし、前回の改元は30年も前のこと。その間にWindowsは急速に進化したが、結局、未経験の「改元」で電卓アプリがバグるというつまづきを見せた。そして、おそらくはほかにもいろいろとあるんじゃないかと思う。5月の連休明けに会社で悲鳴が上がるなんてことがないように願いたい。