|
!
!ツェラー(Zeller)の公式による 曜日を、
! Julian day 0 ~ 2,600,000 ( -4712( 4713BC )年1月1日~2406年6月16日 )
!の全ての日で、ユリウス日の 曜日と、比較する。
!-----------------------------------------------------------
FOR J2_=0 TO 2600000 !J2= 0:MON 1:TUE 2:WED … julian
CALL DJ200
CALL Zeller((LY),(LM),LD) ! h= 0:SAT 1:SUN 2:MON … zeller
IF MOD(J2_+2,7)<>h THEN
CALL prtday2
PRINT "Error"
STOP
END IF
IF MOD(J2_,10000)=0 THEN CALL prtday2
NEXT J2_
PRINT "0~ 2,600,000 日間全て一致しました。"
SUB prtday1
PRINT USING "julian=####### ": J2_;
PRINT USING "#####年##月##日 (##) ":LY,LM,LD, mid$("月火水木金土日",week+1,1);
PRINT USING "Zeller=### (##)": z, mid$("土日月火水木金X",h+1,1)
END SUB
SUB prtday2 !同じ表示で、こちらは見づらいが 数倍速い。
LET w$="julian="& USING$("#######",J2_)&
&& USING$(">#####",LY)& "年"& USING$("##",LM)& "月"& USING$("##",LD)&
&& "日 ("& mid$("月火水木金土日",week+1,1)& ")"&
&& " Zeller="& USING$("###",z)& " ("& mid$("土日月火水木金X",h+1,1)& ")"
PRINT w$
END SUB
!----------------------------------------------
!ツェラーの公式(Zeller's congruence)
!年の上2桁をyyoo、年の下2桁をooyy、月をmm、日をdd、曜日をhとする。
!注意!! 月が1~2月の場合は、前年の13~14月。2007年1月1日なら2006年13月1日とする。
!h= …0~6( Sat,Sun,Mon,Tue,Wed,Thi,Fri)
! ユリウス暦 ~1582.10.4
! = (dd + int((mm+1)*26/10) + ooyy + int(ooyy/4) + 5 - yyoo) mod 7
! グレゴリオ暦 1582.10.15~ (1582.10.5~1582.10.14 は無い)
! = (dd + int((mm+1)*26/10) + ooyy + int(ooyy/4) + int(yyoo/4) -2*yyoo) mod 7
SUB Zeller(yyyy,mm,dd)
LET ymd=yyyy*1e4+mm*1e2+dd
IF mm< 3 THEN
LET yyyy=yyyy-1
LET mm=mm+12
END IF
LET yyoo= INT(yyyy/100)
LET ooyy= MOD(yyyy,100)
IF 15821014< ymd THEN
LET z= dd+INT(26*(mm+1)/10)+ooyy+INT(ooyy/4)+INT(yyoo/4)-2*yyoo
LET h= MOD(z,7)
ELSEIF ymd< 15821005 THEN
LET z= dd+INT(26*(mm+1)/10)+ooyy+INT(ooyy/4)+5-yyoo
LET h= MOD(z,7)
ELSE
LET z=999
LET h=7
END IF
END SUB
!--------------------------------------------------------------
!Julian Day number
!
!広範囲の式。(-4712.1.1~2400. . ) 消滅区間1582.10.5~1582.10.14
!--------------------------------------------------------------
!ユリウス日 J2_ から、西暦年月日 曜日 LY.LM.LD WEEK( 0:MON~ 6:SUN)の逆計算
SUB DJ200
IF 2299160< J2_ THEN !1582.10.4< J1582A4= 2299160
!--(1582.10.15~1582~12.31) (1583.1.1~ )
LET ww=INT((J2_-2341972)/36524.25)+17 !( ww00.01.00) J1700= 2341972
LET J0_=2341972+INT(36524.25*(ww-17)) !( 1700.01.00) J1700= 2341972
IF MOD(ww,4)<>0 THEN LET J1=365 ELSE LET J1=366
CALL DJ27
LET LY=LY+100*ww
ELSE
LET J0_=1721058-1 !( 0000.01.00) J0000=1721058-1
LET J1=366
CALL DJ27
END IF
END SUB
SUB DJ27
LET D_=J2_-J0_+428-J1
LET LY=INT((D_-122.0001)/365.25)
IF LY=-1 THEN LET W_=D_+J1 ELSE LET W_=D_-INT(365.25*LY)
LET LM=INT( W_/30.6001)
LET LD=W_-INT( 30.6001*LM)
IF LM< 14 THEN LET LM=LM-1 ELSE LET LM=LM-13
IF LM<=2 THEN LET LY=LY+1
!--
LET WEEK=MOD(J2_,7)
END SUB
END
|
|