最近、経過日数の算出について調べる機会があったので、メモ代わりにここに記しておく。
経過日数の算出には以下の2つの方法がある。
- 開始日付と終了日付の差から求める。
- 基準日と開始日付の差、基準日と終了日付の差を求め、それぞれの差の差から求める。
開始日付と終了日付が、同じ年、同じ月の日付であれば 1. の方法でも算出できるだろう。しかし、月が異なればその計算は非常に煩雑になる。汎用性を考えれば2.を用いた方が実用的であろう。ここではその方法を示す。
1. 基準日に何を用いるか
基準日には様々なものを用いる事が出来る。例えば、満年齢は「自分の誕生日を基準日とした本日までの経過年数」と言う事が出来るし、西暦は「キリストの誕生年を基準日とした本日までの経過年数」*1ということが出来る。それこそ、鉄腕アトム*2の誕生日である2003年4月7日を基準日にしたって構わないのだ。
そう言う特殊な事例を挙げても仕様がないので、ここではあくまでも汎用的な基準日を用いて計算する事とする。
2. 「グレゴリウス暦0年1月1日」を基準日とする算出法
まずは「グレゴリウス暦0年1月1日」という仮想日付*3を基準日とする、ツェラーの公式を用いる算出法を紹介する。
- 開始日付が1月または2月の場合、これを13月、14月に変換する。
なぜそういうことをするのかということは、ここでは考えてはいけない。学術的なことをいえばきちんと理由があるのだろうが、別にツェラーの公式について考えるわけではないので、ここでは「そういうものなのだ」とする。
例1:開始日が「2003年4月7日」の場合、そのまま用いる。
例2:開始日が「2003年1月1日」の場合、変換して「2002年13月1日」で計算する。
- グレゴリウス暦0年1月1日から開始年1月1日までの日数を計算する。
この計算には以下の式を用いる。
365 × 開始年 + int( 開始年 ÷ 4 ) - int( 開始年 ÷ 100 ) + int( 開始年 ÷ 400 )
*4例1:開始日が「2003年4月7日」の場合、
365 × 2003 + int( 2003 ÷ 4 ) - int( 2003 ÷ 100 ) + int( 2003 ÷ 400 )
= 731095 + 500 - 20 + 5
= 731580(日)例2:開始日が「2003年1月1日」の場合、
365 × 2002 + int( 2002 ÷ 4 ) - int( 2002 ÷ 100 ) + int( 2002 ÷ 400 )
= 730730 + 500 - 20 + 5
= 731215(日) - 開始年1月1日から開始日までの日数を計算する。
この計算には以下の式を用いる。
30 × 開始月 + int( ( 開始月 + 1 ) × 3 ÷ 5 ) + 開始日 - 33
例1:開始日が「2003年4月7日」の場合、
30 × 4 + int( ( 4 + 1 ) × 3 ÷ 5 ) + 7 - 33
= 120 + 3 + 7 - 33
= 97(日)例2:開始日が「2003年1月1日」の場合、
30 × 13 + int( ( 13 + 1 ) × 3 ÷ 5 ) + 1 - 33
= 390 + 8 + 1 - 33
= 366(日) - グレゴリウス暦0年1月1日から開始年月日までの日数を計算する。
2.と3.で算出した日数を合計する。
例1:開始日が「2003年4月7日」の場合、
731580 + 97 = 731677(日)
例2:開始日が「2003年1月1日」の場合、
731215 + 366 = 731581(日)
5.~8.は1.~4.と同様に計算する。
- 終了日付が1月または2月の場合、これを13月、14月に変換する。
例1:終了日が「2003年4月16日」の場合、そのまま用いる。
例2:終了日が「2004年1月1日」の場合、変換して「2003年13月1日」で計算する。
- グレゴリウス暦0年1月1日から終了年1月1日までの日数を計算する。
例1:終了日が「2003年4月16日」の場合、
365 × 2003 + int( 2003 ÷ 4 ) - int( 2003 ÷ 100 ) + int( 2003 ÷ 400 )
= 731095 + 500 - 20 + 5
= 731580(日)例2:終了日が「2004年1月1日」の場合、
365 × 2003 + int( 2003 ÷ 4 ) - int( 2003 ÷ 100 ) + int( 2003 ÷ 400 )
= 731095 + 500 - 20 + 5
= 731580(日) - 終了年1月1日から終了日までの日数を計算する。
例1:終了日が「2003年4月16日」の場合、
30 × 4 + int( ( 4 + 1 ) × 3 ÷ 5 ) + 16 - 33
= 120 + 3 + 16 - 33
= 106(日)例2:終了日が「2004年1月1日」の場合、
30 × 13 + int( ( 13 + 1 ) × 3 ÷ 5 ) + 1 - 33
= 390 + 8 + 1 - 33
= 366(日) - グレゴリウス暦0年1月1日から終了年月日までの日数を計算する。
例1:終了日が「2003年4月16日」の場合、
731580 + 106 = 731686(日)
例2:終了日が「2004年1月1日」の場合、
731580 + 366 = 731946(日)
- 開始年月日から終了年月日までの日数を計算する。
4.と8.で算出した日数の差を算出する。
例1:開始日が「2003年4月7日」、終了日が「2003年4月16日」の場合、
731686 - 731677 = 9(日)
例2:開始日が「2003年1月1日」、終了日が「2004年1月1日」の場合、
731946 - 731581 = 365(日)
3. 「西暦1970年1月1日」を基準日とする算出法
C、C++、JAVA、JavaScriptなどでは、時間(及び日付)を「西暦1970年1月1日からの秒数(またはミリ秒数)」で管理している。そのため、差を算出した後、秒数(またはミリ秒数)を日数に変換すればよい。
4. 「西暦1900年1月1日」を基準日とする算出法
Microsoft® Excelでは、日付を「西暦1900年1月1日からの日数」または「西暦1904年1月2日からの日数」で管理している。*5そのため、差を算出すれば、日数の計算が出来る。