■両端入れの期間計算アルゴリズム■

 ■ハードウエア、OSによりカレンダーのインプリメントは異なるため、その部分は「定義」扱いとしている。
 ■メインフレームのCOBOLなどでコーディングするには、月ごとの「末日テーブル」と「閏年判定」のロジックが必要となるだろうし、特殊な日付からの日数で年月日/曜日が求まるシステムではもう少し楽になる。
; 暦に従った日から日の期間計算のアルゴリズム(両端入れ)

; 定義

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

戻る