ツェラー(Zeller)の公式とユリウス日の比較

 投稿者:SECOND  投稿日:2010年 8月20日(金)03時44分54秒
  !
!ツェラー(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
 

戻る