目ずらし記事

mezalaのブログ

日数計算の技術

 めずらしきこと。

 先日,生まれてから19,358日も経過し,祝ってもらうほどであった。…と言っても,1年にいっぺんやってくるアレなのだが,ふと自分が何日生きてきたのかと思い,daysdiff.def を久々に実行してみたのだった。
 さて,日数計算というのは非常にやっかいな代物だ。特定日付の曜日を算出する計算式は,牧師でもあった数学者により彼の名を冠した「ツェラーの公式」という比較的すっきりした計算式があるのだが,「曜日と日数計算の部屋」というサイト(現在は閉じてしまっている)で「月平均日数」定数をいただいてきて,ようやくVZマクロで実現できたのだった。
 思えば,VZのマクロ師には暦に関心を寄せる人が多かった。古典的なcalendar.defやその高速版,祝日対応した拡張版などが生み出された。祝日法に頻繁な改訂が加えられたこともあり,lxcland.defを力技で今月やってくる白銀週間に対応したことも記憶に新しい。

 せっかくだから月平均日数の考え方を書き残しておこう。

【基準日からの日数の計算】
 「基準日」とは,グレゴリオ暦をその採用年以前から適用したと仮定して,日数計算しやすい起点である0年3月1日を暦の1日目とし,その前日の0年2月末日を言う。(グレゴリオ暦採用は1583年以降なのでそれ以前の日付は架空)
 この基準日からの総日数を求めるためには,1月と2月をそれぞれ前年の13月と14月として計算する。こうすることで2月の閏で変動する部分以外は固定されるためである。
 計算用の仮年月は,次のように置き換える。
  1月〜2月:前年の11月〜12月,3月〜12月:当年の1月〜10月
 実際の計算においては,前月までの月数を積算することになるので,1月〜2月は年を1減らして月に9を足し,3月〜12月は年はそのままで月から3を減じる。日はそのままで,年月日をそれぞれ変数y,m,dに代入するものとする。
 計算用の定数は次のとおり。
  年の日数:365
  月の日数:30.6(2月を除く11ヵ月の平均日数,端数は四捨五入)
 このほかに,4で割り切れる年は閏年となり,100で割り切れる年は閏年でなくなり,400で割り切れる年は閏年になるという特別な閏年の加減を行う。絶妙なのは月の平均日数の値に30.6を使用して四捨五入するというところで,より平均日数に近似の30.636を使用すると繰り上がりが発生してうまくいかない。
 基準日からの経過日数tは,以下の式で求められる。
 t = y * 365 + m * 30 + ( m * 6 + 5) / 10 + d + y / 4 + y / 400 - y / 100,
(VZは浮動小数点数に対応していないので,小数を含むと多少くどくなる。)