新しく発言する  EXIT  インデックスへ

日数計算


  日数計算 しばっち 2008/03/30 19:32:26 
  続き しばっち 2008/03/30 19:33:05 
   └西暦1年1月1日からの日数から西暦年月日に変... 山中和義 2008/04/01 12:02:19  (修正1回)
    ├!経過年月日の計算 山中和義 2008/04/01 16:09:28  (修正2回)
Re: 西暦1年1月1日からの日数から西暦年月日に変...  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/04/01 16:09:28 ** この記事は2回修正されてます
!経過年月日の計算

SUB DateDiffYMD(y1,m1,d1, y2,m2,d2, y,m,d) !西暦y1年m1月d1日から基準日(西暦y2年m2月d2日)までの経過年月日を得る
LET y=y2 !被減数と減数の大きさを考慮する
LET m=m2
LET d=d2

IF d<d1 THEN !引けなければ、月から借りる
LET m=m-1
IF m=0 THEN !その月の日数に換算する
LET d=d+DayOfMonth(y,12)
ELSE
LET d=d+DayOfMonth(y,m)
END IF
END IF

IF m<m1 THEN !引けなければ、年から借りる
LET y=y-1
LET m=m+12 !その年の月数に換算する
END IF

LET y=y-y1 !実際に減算する
LET m=m-m1
LET d=d-d1
END SUB


FUNCTION DayOfMonth(y,m) !西暦y年m月の日数を得る
LET a=EOMonth(m) !平年
IF m=2 THEN LET a=a+IsLeapYear(y) !うるう年の補正
LET DayOfMonth=a
END FUNCTION


!下位ルーチン
FUNCTION IsLeapYear(y) !うるう年の判定
LET IsLeapYear=0
IF (MOD(y,4)=0 AND MOD(y,100)<>0) OR MOD(y,400)=0 THEN LET IsLeapYear=1 !うるう年
END FUNCTION


!定数
DATA 31,28,31,30,31,30,31,31,30,31,30,31 !各月の日数(平年)
DIM EOMonth(12)
MAT READ EOMonth
!------------------------------ ここまでがサブルーチン


LET y1=2000
LET m1=2
LET d1=29

LET y2=2008 !Today
LET m2=4
LET d2=1

CALL DateDiffYMD(y1,m1,d1, y2,m2,d2, y,m,d) !経過年月日
PRINT y;"年"; m;"ヶ月"; d;"日"



!別解
LET a=( (y2*100+m2)*100+d2 ) - ( (y1*100+m1)*100+d1 ) !yyyymmdd形式
LET y=INT(a/10000) !yyyy.mmdd
PRINT y;"年"


END


!年齢計算に使用できるが、誕生日に加算されるため法律上の年齢にはなりません。
!基準日の+1などの工夫が必要です。
    └!日付関連のサブルーチン 山中和義 2008/04/02 15:36:28 
     └つづき(使用例、カレンダー) 山中和義 2008/04/02 15:38:11 

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。