!日付関連のサブルーチン
!注意 1582年10月15日以降の現行のグレゴリオ暦に対応する。
FUNCTION WeekInYear(y) !西暦y年の週の数を得る ※52,53 LET WeekInYear=WeekNumber(y,12,31) END FUNCTION
FUNCTION WeekNumber(y,m,d) !西暦y年m月d日は1月1日から第何週目にあるか計算する ※0,1〜52,53、前年の週の最後にある場合は、0 LET WeekNumber=Week(y,1,DayOfYear(y,m,d)) !※西暦y年1月の1日〜365,366日と解釈する END FUNCTION
FUNCTION Week(y,m,d) !西暦y年m月の第何週目にあるか計算する ※週の始めは月曜日。前月の週の最後にある場合は、0 LET Week=INT((d+DayOfWeek(y,m,1)-2)/7)+1 END FUNCTION
FUNCTION DayOfYear(y,m,d) !西暦y年の1月1日からの日数を得る ※1〜365,366 LET DayOfYear=DateFrom111(y,m,d)-DateFrom111(y,1,1)+1 END FUNCTION
FUNCTION DayInYear(y) !西暦y年の日数を得る ※365,366 LET DayInYear=365+IsLeapYear(y) END FUNCTION
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 DayOfWeek(y,m,d) !西暦y年m月d日の曜日を得る ※0なら日曜日、1なら月曜日、2なら火曜日、……、6なら土曜日 LET DayOfWeek=MOD(DateFrom111(y,m,d),7) !西暦1年1月1日を日曜日とする END FUNCTION
FUNCTION DateDiff(y1,m1,d1, y2,m2,d2) !西暦y1/m1/d1〜y2/m2/d2間の日数を得る LET DateDiff=DateFrom111(y2,m2,d2)-DateFrom111(y1,m1,d1) 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
FUNCTION DateFrom111(y,m,d) !西暦1年1月1日からの日数を得る ※グレゴリオ暦を線形的に拡張したものである。 LET yy=y-1 !年 LET a=yy*365+INT(yy/4)-INT(yy/100)+INT(yy/400) FOR i=1 TO m-1 !月 LET a=a+EOMonth(i) NEXT i IF m>2 THEN LET a=a+IsLeapYear(y) !うるう年の補正 LET a=a+d !日 LET DateFrom111=a END FUNCTION
!定数 DATA 31,28,31,30,31,30,31,31,30,31,30,31 !各月の日数(平年) DIM EOMonth(12) MAT READ EOMonth !------------------------------ ここまでがサブルーチン
|