DateTime クラスのドキュメントを読んでいた。

 ほんの小さな好奇心で調べ始めたものだったが、世界文学のふたりの巨匠の命日を引き合いに出して暦の問題を鮮やかに示す文章に興奮させられて、つい読み込んでしまった。それはこんな例である。

shakespeare = DateTime.iso8601('1616-04-23', Date::ENGLAND)
 #=> Tue, 23 Apr 1616 00:00:00 +0000
cervantes = DateTime.iso8601('1616-04-23', Date::ITALY)
 #=> Sat, 23 Apr 1616 00:00:00 +0000

 Date::ENGLANDを与えるかDate::ITALYを与えるかによって、異なる曜日が示される。これはつまり、彼らふたりの没日が日付の上では一致していても、暦の上では一致しないことを示唆している。

 ドキュメントによると、DateTimeクラスはこういった「歴史的文脈」を取り扱うときに採用されるべきで、それ以外のケース(つまり我々が普段使うような用途)では素直にTimeクラスを使うよう指示されている。

 なおDateTimeはDateのサブクラスであり、Timeクラスとは分離されている。そしてDateもDateTimeも標準クラスではなく、 date gem が提供している。

require 'date'
DateTime.ancestors
# => [DateTime, Date, Comparable, Object, Kernel, BasicObject]

ふたつの暦の歴史的背景

 以下は補足として、Date::ITALYDate::ENGLANDの背景について知ったことを書く。なぜセルバンテスはスペイン地域の人物であるのに、彼の命日を示すためにイタリアの暦を使うのか?

 まず、今日一般に合意され利用されているグレゴリオ暦の開発と導入は、ローマ教皇グレゴリウス13世によるものである。誤差を考慮せず、閏年も存在せずに運用されてきたユリウス暦のカレンダーが、実際の太陽の運行から乖離していた。これはそのまま放置しては暦に基づく宗教的記念節の正統性が揺らぐ、という深刻さをはらんでいた1

 そういうわけで、カトリック諸国のユリウス暦からグレゴリオ暦への移行は1582年に行われた。カトリック諸国は無事に移行するが、カトリックに同調しないプロテスタント地域ではユリウス暦が継続した。とはいえユリウス暦には実務上の不都合があるため、ドイツ諸邦を皮切りに、プロテスタント諸国にもグレゴリオ暦が浸透していく。

 そして1752年にイギリスがグレゴリオ暦に切り替えたことを持って、キリスト教世界の暦はひとまず統一をみたようである。アメリカ独立戦争以前のことであるから、植民地時代のアメリカの暦もこの年を境に切り替えられた。

 こういう背景のために、Date::ITALYDate::ENGLANDのふたつの定数がDateクラスの暦を示す値としてあるようである。デフォルトではDate::ITALYが採用される。

 イギリスの暦では1752年9月2日でもってユリウス暦が終わり、翌日を9月14日としてグレゴリオ暦が始まる。

date = DateTime.iso8601('1752-09-02', Date::ENGLAND)
date + 1
# => <DateTime: 1752-09-14T00:00:00+00:00 ((2361222j,0s,0n),+0s,2361222j)>

 ちなみに UNIX の cal コマンドでも同じように表現されている。こちらはイギリスの暦がデフォルトとなっている。

% cal -d 1752-09
   September 1752
Su Mo Tu We Th Fr Sa
       1  2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30