Hicri Takvim

<code type="java">
package astroLib;
 
import java.util.Calendar;
/**
 * @author http://www.cepmuvakkit.com
 */
public class HijriCalendar {
 
    private Calendar cal;
    private double MJD;
    private String ismiSuhiri[] = {
        "MUHARRAM", "SAFAR", "REBIULAVVAL", "REBIULAHIR",
        "JAMIZIALAVVAL", "JAMIZIALAHIR", "RAJAB", "SHABAN",
        "RAMADHAN", "SHAVVAL", "ZILKADE", "ZILHICCE"};
    private int Lunation;
    private int hijriYear, hijriMonth, hijriDay;
    private boolean[] isFound;
    private double newMoonMoment;      //Calculated time  for the New Moon in ModifiedJulianDays UTC
    private double crescentMoonMoment; // Calculated time for the Crescent Moon in ModifiedJulianDays UTC
    final double synmonth = 29.530588861;// Synodic Month Period
    final double dT = 7.0 / 36525.0;           // Step (1 week)
    final double dTc = 3.0 / 36525.0;          // Step (3 days)
    final double Acc = (0.5 / 1440.0) / 36525.0;  // Desired Accuracy (0.5 min)
    final double MJD_J2000 = 51544.5;
    final double MLunatBase = 23435.90347;
    //  Modified Base date for E. W. Brown's numbered  series of
    //  lunations (1923 January 16 02:41) 2423436-2400000.5=23435.5
    //  2423436.40347   23435,9034699998
    //  which is solved according to the 8 degrees elongation angle.
    //  private double timeDifferenceforET_UT;  // Correction variable due to  difference of ephemeris time and universal time
 
    public HijriCalendar(int Year, int Month, int Day) {
 
        this.MJD = APC_Time.Mjd(Year, Month, Day, 0, 0, 0);
        cal = APC_Time.CalDat(MJD);
 
        double Tnow, T0, T1, TNewMoon, TCrescent; // Time( Ephemeris:disabled) in Julian centuries since J2000
        double D0, D1;
        Tnow = (MJD - MJD_J2000) / 36525.0;
        T1 = Tnow;
        T0 = T1 - dT;  // decrease 1 week
        isFound = new boolean[1];
        isFound[0] = false;
        // Search for phases   bracket desired phase event
        MoonPhases newMoon = new NewMoon();
        MoonPhases crescentMoon = new CrescentMoon();
        D1 = newMoon.calculatePhase(T1);
        D0 = newMoon.calculatePhase(T0);
        while ((D0 * D1 > 0.0) || (D1 < D0)) {
            T1 = T0;
            D1 = D0;
            T0 -= dT;
            D0 = newMoon.calculatePhase(T0);//Finds correct week for iteration
        }
        // Iterate NewMoon time
        TNewMoon = APC_Math.Pegasus(newMoon, T0, T1, Acc, isFound);
        // Correct for difference of ephemeris time and universal time currently disabled
        // ETminUT ( TPhase, ET_UT, valid );
        newMoonMoment = (TNewMoon * 36525.0 + MJD_J2000);// - ET_UT/86400.0;
        Lunation = (int) Math.floor((newMoonMoment + 7 - MLunatBase) / synmonth) + 1;
        // 1341 (29 CemuzuyelEvvel) is the hicri day for the 17 January 1923
        // which is the start day of the Brown's Lunation Number;
        hijriYear = (Lunation + 4) / 12 + 1341;
        // Returns 1 for Muharrem 2 for Safer  .... 12 for Zilhicce
        hijriMonth = (Lunation + 4) % 12 + 1;
        if (isFound[0]) {
            TCrescent = APC_Math.Pegasus(crescentMoon, TNewMoon, TNewMoon + dTc, Acc, isFound);
            crescentMoonMoment = TCrescent * 36525.0 + MJD_J2000;
        }
        hijriDay = (int) (MJD - Math.round(crescentMoonMoment + 0.279166666666667)) + 1;
        //0.279166666666667 comes from the hours 5:18 am
        if (hijriDay == 0) {
            hijriDay = 30;
            hijriMonth--;
            if (hijriMonth == 0) {
                hijriMonth = 12;
            }
        }
 
 
    }
 
    public int getHijriYear() {
       return hijriYear;
    }
 
    public String getHijriMonthName() {
        return ismiSuhiri[(hijriMonth - 1)];
    }
 
    public int getHijriMonth() {
 
        return hijriMonth;
    }
 
    public int getHijriDay() {
        return hijriDay;
    }
 
    public String getHicriTakvim() {
        return getHijriDay() + " " + getHijriMonthName() + " " + getHijriYear();
    }
 
    /**
     * 1 Muharrem=Hijri New Year
     * 10 Muharrem= Day of Ashura
     * 11/12 Rebiulevvel= Mawlid-al Nabi
     * 1 Recep=Start of Holy Months
     * 1st Cuma day on Recep= Lailatul-Raghaib
     * 27 Recep=Lailatul-Me'rac
     * 14/15 Nisfu-Sha'aban
     * 1 Ramadhan=1. Day of Ramadhan
     * 27 Ramadhan= Lailatul-Qadr
     * 1 Sevval=1. Day of Eid-al-Fitr
     * 2 Sevval=2. Day of Eid-al-Fitr
     * 3 Sevval=3. Day of Eid-al-Fitr
     * 9 ZiLHiCCE= A'rafa
     * 10 Zilhicce= 1. Day of Eid-al-Adha
     * 11 Zilhicce= 2. Day of Eid-al-Adha
     * 12 Zilhicce= 3. Day of Eid-al-Adha
     * 13 Zilhicce= 4. Day of Eid-al-Adha
     * @return
     */
    public String checkIfHolyDay() {
        String holyDay = "";
        switch (hijriMonth) {
            case 1:
                if (hijriDay == 1) {
                    holyDay = "NEWYEAR";
                } else if (hijriDay == 10) {
                    holyDay = "ASHURA";
                }
                break;
            case 3:
                if ((hijriDay == 11) || (hijriDay == 12)) {
                    holyDay = "MAWLID";
                }
                break;
            case 7:
                if ((hijriDay == 1) && (hijriMonth == 7)) {
                    holyDay = "HOLYMONTHS";
                }
                if ((cal.get(Calendar.DAY_OF_WEEK) == 6) && (hijriDay < 7)) {
                    holyDay = "RAGHAIB";
                }
                if (hijriDay == 27) {
                    holyDay = "MERAC";
                }
                break;
            case 8:
                if (/*(hijriDay==14)||*/(hijriDay == 15)) {
                    holyDay = "BARAAT";
                }
                break;
            case 9:
                if ((hijriDay == 27)) {
                    holyDay = "QADR";
                }
                break;
            case 10:
                if ((hijriDay == 1) || (hijriDay == 2) || (hijriDay == 3)) {
                    holyDay = hijriDay + "DAYOFEIDFITR";
                }
                break;
 
            case 12:
                if (hijriDay == 9) {
                    holyDay = "AREFE";
                }
                if ((hijriDay == 10) || (hijriDay == 11) || (hijriDay == 12) || (hijriDay == 13)) {
                    holyDay = (hijriDay - 9) + "DAYOFEIDAHDA";
                }
                break;
        }
 
        return holyDay;
 
 
    }
 
    public String getDay() {
        String daysName[] = {"SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"};
        return daysName[cal.get(Calendar.DAY_OF_WEEK) - 1];
 
    }
 
 
 
    /*
    //------------------------------------------------------------------------------
    //
    // ETminUT: Difference ET-UT of ephemeris time and universal time
    //
    // Input:
    //
    //   T         Time in Julian centuries since J2000
    //
    // Output:
    //
    //   DTsec     ET-UT in [s]
    //   valid     Flag indicating T in domain of approximation
    //
    // Notes: The approximation spans the years from 1825 to 2005
    //
    //------------------------------------------------------------------------------
    void getETDifferenceInMinUT (double T, double& DTsec, bool& valid)
    {
    //
    // Variables
    //
    int    i = (int) floor(T/0.25);
    double t = T-i*0.25;
 
 
    if ( (T<-1.75) || (0.05<T) ) {
    valid = false;
    DTsec = 0.0;
    }
    else {
    valid = true;
    switch (i) {
    case -7: DTsec=10.4+t*(-80.8+t*( 413.9+t*( -572.3))); break; // 1825-
    case -6: DTsec= 6.6+t*( 46.3+t*(-358.4+t*(   18.8))); break; // 1850-
    case -5: DTsec=-3.9+t*(-10.8+t*(-166.2+t*(  867.4))); break; // 1875-
    case -4: DTsec=-2.6+t*(114.1+t*( 327.5+t*(-1467.4))); break; // 1900-
    case -3: DTsec=24.2+t*( -6.3+t*(  -8.2+t*(  483.4))); break; // 1925-
    case -2: DTsec=29.3+t*( 32.5+t*(  -3.8+t*(  550.7))); break; // 1950-
    case -1: DTsec=45.3+t*(130.5+t*(-570.5+t*( 1516.7))); break; // 1975-
    case  0: t+=0.25;
    DTsec=45.3+t*(130.5+t*(-570.5+t*( 1516.7)));        // 2000-
    }                                                              // 2005
    }
    }*/
}
</code>