; 暦に従った日から日の期間計算のアルゴリズム(両端入れ)
; 定義
Y, M, D ;年、月、日
S = (YS,MS,DS) ;起算日
E = (YE,ME,DE) ;満了日
M = (YM,MM,DM) ;満期日(満了日の翌日)
D1 ;満了日の属する月の前月末日
δ = DE - DS ;日差
T = (Y,M,D) ;日から日の期間年月日数
; アルゴリズム
if S > E then ;起算日が満了日より大
exit error ;エラー処理
end if
N := YE * 12 + ME - (YS * 12 + MS) ;年月差の月数
if DM = 1 then ;満了日がその月の末日
if DS = 1 then ;起算日がその月の1日
D := 0, N := N + 1 ;日差の設定と月数の補正
else ;起算日が1日以外
N := N + 0
if δ >= 0 then ;満了日の日が起算日の日を超えている
D := δ + 1 ;日差の設定
else {δ < 0} ;満了日が起算日の日に到達しない(起算日の日が満了日の月にない)
D := 0 ;日差の設定
end if
end if
else {DM > 1} ;満了日がその属する月の末日未満
if δ >= 0 then ;満了日の日が起算日の日を超えている
D := δ + 1, N := N + 0 ;日差の設定
else {δ < 0} ;満了日の日が起算日の日に到達しない
if DM = DS then ;満了日が起算日の日の前日(δ = -1)
D := 0, N := N + 0 ;日差の設定
else {DM < DS} ;満了日が起算日の日の前々日以前(δ < -1)
N := N - 1 ;月数の補正
if DS > D1 then ;起算日の日が満了日の前月末日より大
D := DE ;日差の設定(満了日前月末日で日差=0)
else {DS <= D1} ;起算日の日が満了日の前月末日以下
D := D1 + δ + 1 ;日差の設定(δ < 0)
end if
end if
end if
end if
Y := int(N / 12) ;月数から年数を抽出
M := mod(N, 12) ;月数からヵ月を抽出
return T
; (c)1996/3/15 chu