• たったひとつの……

仕事で使うコンピュータでは、日付の計算が重要になる。会議やイベントなどの予定、作業にかかった時間、金利などの財務関連処理、さまざまなものに時間が関係する。コンピューターが現在のように普及する前、日付の計算は困難な計算の1つだった。毎月の日数は月によって違い、いわゆる大の月と小の月は交互に来るわけでもない(カエサルのしわざ)。

このため、日付計算には、たとえば毎月を30日としてその12倍の360日を1年とする簡易計算方法などが使われていたこともある。Excelには、こうしたコンピュータ普及以前の計算方法(DAYS360関数)などを含め、25もの日付、時間関連の関数がある。しかも、一部の関数は、引数で挙動を変える。DAYS360関数は、米国で使われる方式とEU圏の方式の両方に対応している。

時間は連続しているものなので、日付と時刻は1つのものとして扱うと便利なことが多いため、たいていのプラットフォームでは、“DateTime”オブジェクトとして日時を扱う。年や月、日、時、分、秒といった値は、起点からの経過時間を64 bit(過去には32 bitのこともあった)の整数値(シリアル値などとから計算される。このときの起点をEPOCHという。

DateTimeオブジェクトの実体は、EPOCHからの経過時間をシステムの最小時間単位(tickなど呼ばれることがある)で測った値(シリアル値などとも呼ばれる)である。システムの最小時間単位は短いものでは100ナノ秒から秒までさまざまである。CPUが割り込みなどで、カウンタを更新して現在時刻を作る。

EPOCHは、多くの場合、閏年計算を簡単にするキリのいい日付が選ばれる(表01)。4年に一回というルールから、1年を365.25として計算すると、シリアル値からの年月日の計算がラクになるからだ。閏年には、100年に一回、400年に一回の「補正」がある。1900年は、4で割り切れるが100でも割り切れるので閏年にならない年だ。2000年は、さらに400でも割り切れるので閏年になるという近年まれにみる年(次回は2400年)だったが、残念ながら、過去の日付を扱うという実用を考えると、日付の下限を2000年にすることは難しい(作成日が過去の日付のファイルを受け取る可能性がある)。逆に言うとEPOCHが同じということは、計算方法が同種のものになっている可能性がある。日付計算に関わる問題は、プラットフォーム全体に影響する可能性がある。“2000年問題”もその1つだが、OSの閏年計算のバグがインターネットで問題を起こしたこともあった。

  • ■表01

さて、こうした日付を扱う場合に、欠かせないのが日本の元号など、日付時刻情報の「ローカル」表現だ。そのために最近使われることが多いのが、Unicodeコンソーシアムの提供するICU(International Components for Unicode)だ。ICUはJavaの一部としてスタートしたため、Android(Javaが標準開発言語の1つ)には標準で含まれており、Linuxなどでも依存関係などで入っていることが多い。Windowsは、長らく独自のEPOCHを持つ日付時刻オブジェクトが使われてきたが、.NET Frameworkは、ICUと同じEPOCHを使い、Windows 10 Ver.1903からはICUを標準で搭載するようになった。そういうわけでICUは多くのプラットフォームで標準になりつつある。.NET 5では、ロケールなどの言語、地域、文化関連の処理にICUを標準で使う。

多くの日付時刻のオブジェクトでは、年月日などを指定した絶対指定は簡単だが、相対的な日付、たとえば、今月末などに関しては、計算しなければならない。ICU系のCalenderクラスやそれに似たDataTimeクラスでは、日付や時間の加減算が簡単に行える。これを使うと、今日、明日、今月末、先月末、今月の1日などといった意外に使うのに簡単に求まらない日付の計算ができる(表02)。たとえば、今月末は、来月1日の前日であり、先月末は、今月1日の前日、来月末は、来来月の1日の前日である。このような計算をするのは、閏年や月の長さを考えなくても計算ができるようにするからだ。

  • ■表02

今回のタイトルのネタは、James Tiptree, Jr.の“The Only Neat Thing to Do”(邦題 たったひとつの冴えたやりかた)である。日付というと誕生日なのだが、筆者は、誕生日というとこの作品を思い出してしまう。というのも主人公は、誕生日に宇宙船をもらい、物語が始まるからである。作者の背景などをまったく無視したとしても、いい話である。ただ、歳取ってから読み直したら感動よりも、感動した記憶しか思い浮かばない。お年寄りが読む本とは言い難いので、未読ならば、今すぐにでも読んでおくことをお勧めする(できればハヤカワSF文庫版で)。さて、日付ということからは、グレゴリオ暦への改暦が重要な出来事として扱われている他の作品もネタの候補になったのだが、ネタバレなので扱いが難しく断念した。