|
> No.1728[元記事へ]
!修正 2012.1.28 updated
!2012.1.25 origin
!キー入力は無いので、中ほど DATA 文に、所要の西暦年月日を、
!まとめて、書いて下さい。
!西暦1999~2013 ( イスラム暦1420~1435 ) の間は 合っている様ですが、
!参考程度にして下さい。というのは、閏年( 年354日に 12月30日を加えて
! 年355日にする年 )が 前後の年へ 人為的操作を 受けているとしか思えず、
!数理的規則性だけでは、1日ズレる年度が、1423~1425 1431~1433 付近にあった。
!このプログラムでは、この区間を合せ込みましたが、他にどれ位あるのか、
!分りません。
!2012.1.27
!※その後の調査で、サイトにより異なる日付が見られ、確かなことは不明、
! 現在は、(ジェトロ)アジア経済研究所のデータ-へ合せる様にした。
! ここのデーターだと、殆んど無調整で命中する。
!2012.1.28
!※太陰年に、354.36705日/年, 25101/850*12, 765433/25920*12 ・・等でなく、
! やや短い 354.36695 ~354.36701日/年を、用いると全くの無調整で一致した。
! この意味する所は、暦が用いている実態の太陰年らしい。
!※DATA 文の西暦年月日の後に、既知のイスラム暦年月日、=yyyymmdd を付加すると、
! 異なる場合にアラームを出すようにした。付加しなければ変換のみとなる。
!----------------------------------------------------------
!テキスト・ウィンドウの、左上位置(x0,y0)と、枠幅(xw,yw) 設定。
CALL SetWindowPos( WinHandle("TEXT" ),0, 340,150,685,530, 0)
SUB SetWindowPos( handle,C2, x0,y0,xw,yw, nFLG ) ! nFLG, 0=x0y0xwyw 1=x0y0 2=xwyw
ASSIGN "user32.dll","SetWindowPos"
END SUB
!----------------------------------------------------------
!-------------------------------------------------
!イスラム暦 元年1月1日( 西暦 622.7.16 金) 太陰暦
!-------------------------------------------------
LET Tyy=354.36700 !太陰年 ○354.36695 ~354.36701 !×354.36705 25101/850*12 765433/25920*12
PRINT "Tyy/12 ";Tyy/12;" Tyy";Tyy
!
DIM wk$(0 TO 6)
MAT READ wk$
DATA 日,月,火,水,木,金,土
!
!--------
!テスター、ユリウス日の動作。(今日の日付、cJD → DcJ)
LET i$=DATE$
LET J2_=cJD200( VAL(i$(1:4)),VAL(i$(5:6)),VAL(i$(7:8)))
CALL DcJ200( J2_)
PRINT USING "通日####### 西暦####年##月##日(##) 今日の日付" :J2_,LY,LM,LD,wk$(week)
!
!--------
!イスラム暦 起点 JB_ のセットアップ 確認。
LET JB_=cJD200( 622,7,16)
CALL DcJ200( JB_)
PRINT USING "通日####### 西暦####年##月##日(##) イスラム暦の起点" :JB_,LY,LM,LD,wk$(week)
!
!--------
!テスター、西暦 DATA 文 "yyyy/mm/dd" ~"" → イスラム暦 へ変換。
PRINT
CALL trans_data
STOP !●この STOP 文を外すと、1999, 4,17~2014,10, 5 区間の全表示。
!
!--------
!テスター、西暦 yyyy,mm,dd ~yyyy,mm,dd → イスラム暦 へ変換。
PRINT
!FOR J2_=cJD200( 622,7,16) TO cJD200( 626,7,16)
FOR J2_=cJD200( 1999, 4,17) TO cJD200( 2014,10, 5)
LET J_ =J2_-JB_
CALL DcJ200( J2_)
CALL islam2( J_ ) !● ↓ 月と年の 変わり目の確認なので、通常は if then を外す。
IF 28< iD OR iD< 3 THEN ! xx.29 xx.30 xx.1 xx.2 のみ表示
PRINT USING "通日####### 西暦####年##月##日(##)" :J2_,LY,LM,LD,wk$(week);
PRINT USING" islam_通日###### ####年##月##日 ####":J_,iY,iM,iD,u$
END IF ! xx.29 xx.30 xx.1 のみ表示
NEXT J2_
SUB trans_data
DO
READ IF MISSING THEN EXIT DO: d$
IF d$=" " THEN
PRINT
ELSE
LET w=POS(d$,"/")
IF w=0 THEN EXIT DO
LET YY=VAL(d$(1:w-1))
LET w1=POS(D$,"/",w+1)
IF w1=0 THEN EXIT DO
LET MM=VAL(d$(w+1:w1-1))
LET xx=POS(D$,"=",w1+1)
IF xx=0 THEN LET w2=LEN(d$)+1 ELSE LET w2=xx
LET DD=VAL(d$(w1+1:w2-1))
!---
LET J2_=cJD200( YY,MM,DD)
LET J_ =J2_-JB_
CALL DcJ200( J2_)
CALL islam2( J_ )
PRINT USING "通日####### 西暦####年##月##日(##)" :J2_,LY,LM,LD,wk$(week);
PRINT USING" islam_通日###### ####年##月##日 #### df.####":J_,iY,iM,iD,u$,FP(df)
!---
IF 0< xx THEN
IF iY<>VAL(d$(xx+1:xx+4)) OR iM<>VAL(d$(xx+5:xx+6)) OR iD<>VAL(d$(xx+7:xx+8)) THEN
PRINT "Error"
beep
WAIT DELAY 1
END IF
END IF
END IF
LOOP
END SUB
!太陰年(Tyy)= 354.36698 ○暦の実態=354.36695 ~354.36701日/年、×公称=354.36705日/年
! 平年= 354日/年 閏年= 355日/年( 12.1~12.29+12.30 …11回/30年)
! 奇数月= 30日/月 偶数月= 29日/月
SUB islam2(J_)
LET jw_=J_+.999
LET iY= IP( jw_/Tyy) +1
LET df=MOD( jw_,Tyy)
!---
LET d_= IP( df)
IF d_< 354 THEN LET Nmm=29.5 ELSE LET Nmm=29.51
LET iM= IP( d_/Nmm) +1
LET iD=IP( MOD( d_,Nmm)) +1
!---
IF FP(df)< FP(Tyy) THEN LET u$="閏年" ELSE LET u$=""
END SUB
!-------------------------------------------------------
! IDE-JETRO 独立行政法人日本貿易振興機構
!(ジェトロ)アジア経済研究所(独立行政法人日本貿易振興機構の附置研究機関)
!
! ヒジュラ(イスラーム)暦・西暦換算表 による。
!--------------------------------------------------------
DATA " 622/ 7/16 =00010101" ! 1. 1.1
DATA " "
DATA "1999/ 4/16" !
DATA "1999/ 4/17 =14200101" !1420. 1.1
DATA "1999/ 4/18 =14200102" !
DATA " "
DATA "2000/ 4/ 5" !
DATA "2000/ 4/ 6 =14210101" !1421. 1.1
DATA "2000/ 4/ 7 =14210102" !
DATA " "
DATA "2001/ 3/25" !
DATA "2001/ 3/26 =14220101" !1422. 1.1
DATA "2001/ 3/27 =14220102" !
DATA " "
DATA "2002/ 3/14" !
DATA "2002/ 3/15 =14230101" !1423. 1.1
DATA "2002/ 3/16 =14230102" !
DATA " "
DATA "2003/ 3/ 3" !
DATA "2003/ 3/ 4" !1424. 1.1
DATA "2003/ 3/ 5 =14240101" !*1424. 1.1 ← この位置が、確からしい。
DATA "2003/ 3/ 6 =14240102" !
DATA " "
DATA "2004/ 2/20" !
DATA "2004/ 2/21" !1425. 1.1
DATA "2004/ 2/22 =14250101" !*1425. 1.1 ← この位置が、確からしい。
DATA "2004/ 2/23 =14250102" !
DATA " "
DATA "2005/ 2/ 9" !
DATA "2005/ 2/10 =14260101" !1426. 1.1
DATA "2005/ 2/11 =14260102" !
DATA " "
DATA "2006/ 1/30" !
DATA "2006/ 1/31 =14270101" !1427. 1.1
DATA "2006/ 2/ 1 =14270102" !
DATA " "
DATA "2007/ 1/19" !
DATA "2007/ 1/20 =14280101" !1428. 1.1
DATA "2007/ 1/21 =14280102" !
DATA " "
DATA "2008/ 1/ 9" !
DATA "2008/ 1/10 =14290101" !1429. 1.1
DATA "2008/ 1/11 =14290102" !
DATA " "
DATA "2008/12/28" !
DATA "2008/12/29 =14300101" !1430. 1.1
DATA "2008/12/30 =14300102" !
DATA " "
DATA "2009/12/17" !
DATA "2009/12/18 =14310101" !1431. 1.1
DATA "2009/12/19 =14310102" !
DATA " "
DATA "2010/12/ 6" !
DATA "2010/12/ 7" !1432. 1.1
DATA "2010/12/ 8 =14320101" !*1432. 1.1 ← この位置が、確からしい。
DATA "2010/12/ 9 =14320102" !
DATA " "
DATA "2011/11/26" !
DATA "2011/11/27 =14330101" !1433. 1.1
DATA "2011/11/28 =14330102" !
DATA " "
DATA "2012/11/14" !
DATA "2012/11/15 =14340101" !1434. 1.1
DATA "2012/11/16 =14340102" !
DATA " "
DATA "2013/11/ 4" !
DATA "2013/11/ 5 =14350101" !1435. 1.1
DATA "2013/11/ 6 =14350102" !
DATA " "
DATA "2014/ 9/26 =14351201" !1435.12.1
DATA "2014/10/ 5 =14351210" !1435.12.10
!---below random
!DATA "stop"
DATA " "
DATA "2014/10/24" !
DATA "2000/ 1/ 8 =14201001" !1420.10.1
DATA "2007/10/13 =14281001" !1428.10.1
DATA "2012/ 1/ 1 =14330206" !1433.2.6
DATA "2012/ 1/25 =14330301" !1433.3.1
DATA "2012/11/30 =14340116" !1434. 1.16
DATA "2012/12/31 =14340217" !1434. 2.17
!-------------------------------------------------------------
!西暦年月日 YY.MM.DD から、ユリウス日 CJD の計算
! -4712.1.1 ~2400.xx.xx の範囲、消滅区間 1582.10.5 ~1582.10.14
!-------------------------------------------------------------
FUNCTION cJD200( YY,MM,DD )
LET WY=YY
IF 1582< YY THEN !1583.1.1~~
!-- ( 1583.1.1~ yyyy.12.31), 1600+100.01.00 (1700.01.00) J1700= 2341972
LET ww=INT(WY/100)
LET WY=MOD(WY,100) !LET WY=WY-100*ww
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
!--- WY.MM.DD=00.1.1~99.12.31 J0_=J.(ww00.1.0) J1=365|366
ELSE
LET J0_= 1721058-1 !J0000= J.(0000.1.0) julian date
LET J1=366
END IF
!---
IF 2< MM THEN
LET WM=MM+1
ELSE
LET WM=MM+13
LET WY=WY-1
END IF
IF WY=-1 THEN
LET J2_=J0_-428 +INT(30.6001*WM)+DD
ELSE
LET J2_=J0_-428+J1+INT(365.25*WY) +INT(30.6001*WM)+DD
END IF
!---
IF YY=1582 AND 2299160< J2_ THEN !1582.10.4 ~1582.xx.xx J1582A4= 2299160
LET J2_=J2_-10 !1582.10.15~1582.12.31 ok.
IF J2_<=2299160 THEN LET J2_=-1 !1582.10.5 ~1582.10.14 error
END IF
LET cJD200=J2_
END FUNCTION
!----------------------------------------------------------------------------
!(ユリウス日 CJD) J2_ から、西暦年月日 曜日 LY.LM.LD WEEK( 0:日~6:土) の逆計算
! -4712.1.1 ~2400.xx.xx の範囲、消滅区間 1582.10.5 ~1582.10.14
!----------------------------------------------------------------------------
SUB DcJ200( J2_)
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
ELSE
LET J0_=1721058-1 !julian date( 0000.01.00) J0000=1721058-1
LET J1=366
END IF
!---
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
!---
IF 2299160< J2_ THEN LET LY=LY+100*ww !1582.10.4< J1582A4= 2299160
LET WEEK=MOD(J2_+1, 7)
END SUB
!-------------------------------------------------
! Chronological Julian Day(CJD)
!
! 小数下の端数を、時間に対応させるため、( 0~ 1 → 00:00~24:00)
! JD=0 の基点( 12:00 January 1, 4713 BC, Monday)を、0.5日過去へ下げたもの。
! CJD=0 の基点( 00:00 January 1, 4713 BC, Monday)
!-------------------------------------------------
END
|
|