10

Konversi Hijriyah ke Masehi dan sebaliknya

Berikut adalah fungsi untuk mengubah tanggal Masehi ke Hijriyah dan sebaliknya. Kode program dalam bahasa Pascal ( Delphi ), tetapi saya rasa mudah untuk dikonversi ke bahasa pemrograman lain 😉 , juga saya beri sedikit keterangan. Algoritma saya temukan beberapa tahun yang lalu dari internet tanpa sumber yang jelas. Semoga bermanfaat.

// Mengambil nilai integer dari bilangan real
Function IntPart(FloatNum : real) : integer;
Begin
  if FloatNum < -0.0000001 then
    Result := ceil(FloatNum-0.0000001)
  else
    Result := Floor(FloatNum + 0.0000001);
End;

{ Function HtoM(Tgl : TdateTime) : TdateTime;
  Algoritma diperoleh dari internet tanpa sumber }

Function ConvertDate(HijriToMasehi:Boolean; const y,m,d:Word):TDate;
var
  jd,L,N,i,J,K :integer;
  Rm,Rd,Ry : integer; //result

  Tgl : TDateTime;
  y2,m2,d2 : Word;
begin
  { Merubah nilai y-m-d menjadi variabel TDateTime ( Tgl) }
  EncodeDate(y,m,d,Tgl);
  { Merubah Variabel Tgl menjadi tahun=y2, bulan=m2 dan day=d2 }
  DecodeDate(Tgl,y2,m2,d2);
  { HijriyahDiff = 0 atau bisa +1 atau -1 untuk menyesuaikan jika
    kemungkinan berbeda dengan ruqyah }
  d2 := d2 + HijriyahDiff;
  if HijriToMasehi then // Konversi Hijriyah ke Masehi

  Begin
    jd := intPart((11*y2+3)/30)+354*y2+30*m2-intPart((m2-1)/2)+
          d2+1948440-385;
    if (jd> 2299160 ) then

      Begin
        L := jd+68569;
        N := intPart((4*L)/146097);
        L := L-intPart((146097*N+3)/4);
        i := intPart((4000*(L+1))/1461001);
        L := L-intPart((1461*i)/4)+31;
        J := intPart((80*L)/2447);
        Rd:= L-intPart((2447*j)/80);
        L := intPart(J/11);
        Rm:= J+2-12*L;
        Ry:= 100*(N-49)+i+L;
      End

      else
      Begin
        J := jd+1402;
        K := intPart((j-1)/1461);
        L := J-1461*k;
        N := intPart((L-1)/365)-intPart(L/1461);
        i := L-365*N+30;
        J := intPart((80*i)/2447);
        Rd:= i-intPart((2447*J)/80);
        i := intPart(J/11);
        Rm:= J+2-12*i;
        Ry:= 4*K+N+i-4716;
      End;

      { Hasil fungsi Tanggal, Bulan dan Tahun }

      Result.Day := Rd;
      Result.Month := Rm;
      Result.Year := Ry;
  end
  else // Konversi Masehi ke Hijriyah
    Begin
      if ((y2>1582) OR((y2=1582) AND (m2>10))OR((y2=1582) AND (m2=10)
      AND (d2>14))) then

        jd := intPart((1461*(y2+4800+intPart((m2-14)/12)))/4)+
              intPart((367*(m2-2-12*(intPart((m2-14)/12))))/12)-
              intPart((3*(intPart(
                (y2+4900+intPart((m2-14)/12))/100)))/4)+d2-32075
      else

        jd := 367*y2-intPart((7*(y2+5001+intPart((m2-9)/7)))/4)+
              intPart((275*m2)/9)+d2+1729777;

      L := jd-1948440+10632;
      N := intPart((L-1)/10631);
      L := L-10631*n+354;
      J := (intPart((10985-L)/5316))*(intPart((50*L)/17719))+
           (intPart(L/5670))*(intPart((43*l)/15238));
      L := L-(intPart((30-j)/15))*(intPart((17719*j)/50))-
           (intPart(j/16))*(intPart((15238*j)/43))+29;
      Rm := intPart((24*L)/709);
      Rd := l-intPart((709*Rm)/24);
      Ry := 30*n+j-30;

      { Hasil fungsi Tanggal, Bulan dan Tahun }

      Result.Day := Rd;
      Result.Month := Rm;
      Result.Year := Ry;
    End;
end;

ebta

10 Comments

  1. Good Job! Mudah-mudahan bermanfaat untuk pemrograman yang lain, karena kode-nya sederhana.

    Semoga situs ini terus berkembang dan menyajikan informasi-informasi yang bermanfaat bagi banyak orang.

  2. Ass.

    1st Of All.. SALUT..

    Mas, dulu waktu skripsi, saya mau mengangkat judul tentang Penentuan Arah Qiblat dan Penentuan Masuknya Bulan Hijriyah.. berangkat dari sebuah buku.. tapi, karena kurang referensi dan saya baru buka web ini sekarang, jadi nya tak jadi.

    Terus bjuang.. mas, gimana kalo buat program yang “Full Version” mulai dari penentuan arah kiblat s/d penentuan Masuknya Bulan Hijriyah, tentunya dengan tetap memperhatikan Dalil-Dalil.. Terlepas dari banyaknya perdebatan yang selalu/akan terjadi.

    Wass.

    Oia, Saya Alumni sebuah Lembaga Pendidikan di Bandung, Jurusan Tehnik Informatika.

  3. Syukron atas info-infonya khususnya info tentang software Islam-nya dan mohon ijin untuk didownload ya mas …..

  4. Mas gimana caranya agar tanggal Masehi dan tanggal Hijriyah ada dan berdampingan,kalau bisa sudah berupa software yang udah jadi biar saya bisa download, makasih yaa

  5. Saya sudah mencoba mengaplikasikan ke delphi, tapi hasilnya selalu selisih satu dengan kalender islam yang umum, prayer time yang ada di internet, kecuali dengan shallu. Yang saya maksudkan kalau penaggalan umum tanggal 10 pada program yang didasarkan pada source code di atas (shallu) masih tanggal 9.

    Contoh:

    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs,Math, StdCtrls;

    type
    TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure ConvertDate(HijriToMasehi:Boolean; const y,m,d:Word);
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    { Function HtoM(Tgl : TdateTime) : TdateTime;
    Algoritma diperoleh dari internet tanpa sumber }

    procedure TForm1.ConvertDate(HijriToMasehi:Boolean; const y,m,d:Word);

    // Mengambil nilai integer dari bilangan real
    Function IntPart(FloatNum : real) : integer;
    Begin
    if FloatNum 2299160 ) then

    Begin
    L := jd+68569;
    N := intPart((4*L)/146097);
    L := L-intPart((146097*N+3)/4);
    i := intPart((4000*(L+1))/1461001);
    L := L-intPart((1461*i)/4)+31;
    J := intPart((80*L)/2447);
    Rd:= L-intPart((2447*j)/80);
    L := intPart(J/11);
    Rm:= J+2-12*L;
    Ry:= 100*(N-49)+i+L;
    End

    else
    Begin
    J := jd+1402;
    K := intPart((j-1)/1461);
    L := J-1461*k;
    N := intPart((L-1)/365)-intPart(L/1461);
    i := L-365*N+30;
    J := intPart((80*i)/2447);
    Rd:= i-intPart((2447*J)/80);
    i := intPart(J/11);
    Rm:= J+2-12*i;
    Ry:= 4*K+N+i-4716;
    End;

    { Hasil fungsi Tanggal, Bulan dan Tahun }
    tanggalku := IntToStr(Rd)+’ ‘+IntToStr(Rm)+’ ‘+IntToStr(Ry);
    //Result.tglku.Day := Rd;
    //Result.tglku.Month := Rm;
    //Result.tglku.Year := Ry;
    end
    else // Konversi Masehi ke Hijriyah
    Begin
    if ((y2>1582) OR((y2=1582) AND (m2>10))OR((y2=1582) AND (m2=10)
    AND (d2>14))) then

    jd := intPart((1461*(y2+4800+intPart((m2-14)/12)))/4)+
    intPart((367*(m2-2-12*(intPart((m2-14)/12))))/12)-
    intPart((3*(intPart(
    (y2+4900+intPart((m2-14)/12))/100)))/4)+d2-32075
    else

    jd := 367*y2-intPart((7*(y2+5001+intPart((m2-9)/7)))/4)+
    intPart((275*m2)/9)+d2+1729777;

    L := jd-1948440+10632;
    N := intPart((L-1)/10631);
    L := L-10631*n+354;
    J := (intPart((10985-L)/5316))*(intPart((50*L)/17719))+
    (intPart(L/5670))*(intPart((43*l)/15238));
    L := L-(intPart((30-j)/15))*(intPart((17719*j)/50))-
    (intPart(j/16))*(intPart((15238*j)/43))+29;
    Rm := intPart((24*L)/709);
    Rd := l-intPart((709*Rm)/24);
    Ry := 30*n+j-30;

    { Hasil fungsi Tanggal, Bulan dan Tahun }
    tanggalku := IntToStr(Rd)+’ ‘+IntToStr(Rm)+’ ‘+IntToStr(Ry);
    //Result.Day := Rd;
    //Result.Month := Rm;
    //Result.Year := Ry;
    End;

    Label1.caption:=tanggalku;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    ConvertDate(False, 2009,2,5);
    end;

    end.

  6. @Ismadi
    wa’alaikumsalaam..
    🙂

    @Amin
    Iya itu kelemahan jika menggunakan algoritma, kadang bisa plus minus 1, makanya i program shollu daya tambahkan menu correction.. karena memang penentuan tanggal dengan melihat hilal..

  7. Ass.Wb
    Makasih ada informasi spt ini saya dari sastra tak paham sangat ttg rumus2, macam mana kalokasih contoh yang jelas biar gampang konversikannya.
    Trims
    Salam

Comments are closed.