最近、経過日数の算出について調べる機会があったので、メモ代わりにここに記しておく。

経過日数の算出には以下の2つの方法がある。

  1. 開始日付と終了日付の差から求める。
  2. 基準日と開始日付の差、基準日と終了日付の差を求め、それぞれの差の差から求める。

開始日付と終了日付が、同じ年、同じ月の日付であれば 1. の方法でも算出できるだろう。しかし、月が異なればその計算は非常に煩雑になる。汎用性を考えれば2.を用いた方が実用的であろう。ここではその方法を示す。


1. 基準日に何を用いるか

基準日には様々なものを用いる事が出来る。例えば、満年齢は「自分の誕生日を基準日とした本日までの経過年数」と言う事が出来るし、西暦は「キリストの誕生年を基準日とした本日までの経過年数」*1ということが出来る。それこそ、鉄腕アトム*2の誕生日である2003年4月7日を基準日にしたって構わないのだ。

そう言う特殊な事例を挙げても仕様がないので、ここではあくまでも汎用的な基準日を用いて計算する事とする。


2. 「グレゴリウス暦0年1月1日」を基準日とする算出法

まずは「グレゴリウス暦0年1月1日」という仮想日付*3を基準日とする、ツェラーの公式を用いる算出法を紹介する。

  1. 開始日付が1月または2月の場合、これを13月、14月に変換する。

    なぜそういうことをするのかということは、ここでは考えてはいけない。学術的なことをいえばきちんと理由があるのだろうが、別にツェラーの公式について考えるわけではないので、ここでは「そういうものなのだ」とする。

    例1:開始日が「2003年4月7日」の場合、そのまま用いる。

    例2:開始日が「2003年1月1日」の場合、変換して「2002年13月1日」で計算する。

  2. グレゴリウス暦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(日)

  3. 開始年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(日)

  4. グレゴリウス暦0年1月1日から開始年月日までの日数を計算する。

    2.と3.で算出した日数を合計する。

    例1:開始日が「2003年4月7日」の場合、

    731580 + 97 = 731677(日)

    例2:開始日が「2003年1月1日」の場合、

    731215 + 366 = 731581(日)

    5.~8.は1.~4.と同様に計算する。

  5. 終了日付が1月または2月の場合、これを13月、14月に変換する。

    例1:終了日が「2003年4月16日」の場合、そのまま用いる。

    例2:終了日が「2004年1月1日」の場合、変換して「2003年13月1日」で計算する。

  6. グレゴリウス暦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(日)

  7. 終了年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(日)

  8. グレゴリウス暦0年1月1日から終了年月日までの日数を計算する。

    例1:終了日が「2003年4月16日」の場合、

    731580 + 106 = 731686(日)

    例2:終了日が「2004年1月1日」の場合、

    731580 + 366 = 731946(日)

  9. 開始年月日から終了年月日までの日数を計算する。

    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そのため、差を算出すれば、日数の計算が出来る。