イスラム暦

 投稿者:永野護  投稿日:2012年 1月21日(土)13時33分29秒
  お頼みしたいことがあります。西暦(グレゴリオ暦)で例えば
2012年1月21日(土曜日)と入力すればイスラム暦××年××月××日(××曜日)
と表示されるようなプログラムを十進basicで作っていただけないでしょうか。
アラブ圏は結構広いのですが、モロッコの日付が知りたいのですが。
どなたかもしお頼みできるようでしたらよろしくお願いします。
 

Re: イスラム暦

 投稿者:SECOND  投稿日:2012年 1月25日(水)19時17分44秒
  > 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
 

戻る