将gregorian日期转换为hijri日期是错误的日子

时间:2016-03-09 17:43:19

标签: android calendar hijri


我想从格里高利转换为Hijri(伊斯兰)日期,我使用this class

问题是伊斯兰月的日期是<29,30,29,30其他
但这个月的日子是&lt; 30,29,30,29其他
任何人都可以帮忙解决这个问题吗?

import java.util.Calendar;

/ **  * Gregorian-Hijri日期转换器  *  *  *本守则用于将公历日期转换为Hijri日期  *  *  * /

公共课DateHigri {

static double gmod(double n,double  m) {
    return ((n % m) + m) % m;
}

static double[] kuwaiticalendar(boolean adjust) {
    Calendar today = Calendar.getInstance();
    int adj=0;
    if(adjust){
        adj=0;
    }else{
        adj=1;
    }

    if (adjust) {
        int adjustmili = 1000 * 60 * 60 * 24 * adj;
        long todaymili = today.getTimeInMillis() + adjustmili;
        today.setTimeInMillis(todaymili);
    }
    double day = today.get(Calendar.DAY_OF_MONTH);
    double  month = today.get(Calendar.MONTH);
    double  year = today.get(Calendar.YEAR);

    double  m = month + 1;
    double  y = year;
    if (m < 3) {
        y -= 1;
        m += 12;
    }

    double a = Math.floor(y / 100.);
    double b = 2 - a + Math.floor(a / 4.);

    if (y < 1583)
        b = 0;
    if (y == 1582) {
        if (m > 10)
            b = -10;
        if (m == 10) {
            b = 0;
            if (day > 4)
                b = -10;
        }
    }

    double jd = Math.floor(365.25 * (y + 4716)) + Math.floor(30.6001 * (m + 1)) + day
            + b - 1524;

    b = 0;
    if (jd > 2299160) {
        a = Math.floor((jd - 1867216.25) / 36524.25);
        b = 1 + a - Math.floor(a / 4.);
    }
    double bb = jd + b + 1524;
    double cc = Math.floor((bb - 122.1) / 365.25);
    double dd = Math.floor(365.25 * cc);
    double ee = Math.floor((bb - dd) / 30.6001);
    day = (bb - dd) - Math.floor(30.6001 * ee);
    month = ee - 1;
    if (ee > 13) {
        cc += 1;
        month = ee - 13;
    }
    year = cc - 4716;

    double wd = gmod(jd + 1, 7) + 1;

    double iyear = 10631. / 30.;
    double epochastro = 1948084;
    double epochcivil = 1948085;

    double shift1 = 8.01 / 60.;

    double z = jd - epochastro;
    double cyc = Math.floor(z / 10631.);
    z = z - 10631 * cyc;
    double j = Math.floor((z - shift1) / iyear);
    double iy = 30 * cyc + j;
    z = z - Math.floor(j * iyear + shift1);
    double im = Math.floor((z + 28.5001) / 29.5);
    if (im == 13)
        im = 12;
    double id = z - Math.floor(29.5001 * im - 29);

    double[]  myRes = new double[8];

    myRes[0] = day; // calculated day (CE)
    myRes[1] = month - 1; // calculated month (CE)
    myRes[2] = year; // calculated year (CE)
    myRes[3] = jd - 1; // julian day number
    myRes[4] = wd - 1; // weekday number
    myRes[5] = id; // islamic date
    myRes[6] = im - 1; // islamic month
    myRes[7] = iy; // islamic year

    return myRes;
}
static String writeIslamicDate() {
    String[] wdNames = {"Ahad", "Ithnin", "Thulatha", "Arbaa", "Khams",
            "Jumuah", "Sabt"};
    String[] iMonthNames = {"Muharram", "Safar", "Rabi'ul Awwal",
            "Rabi'ul Akhir", "Jumadal Ula", "Jumadal Akhira", "Rajab",
            "Sha'ban", "Ramadan", "Shawwal", "Dhul Qa'ada", "Dhul Hijja"};
    // This Value is used to give the correct day +- 1 day
    boolean dayTest=true;
    double[] iDate = kuwaiticalendar(dayTest);
    String outputIslamicDate = wdNames[(int) iDate[4]] + ", " + iDate[5] + " "
            + iMonthNames[(int) iDate[6]] + " " + iDate[7] + " AH";

    return outputIslamicDate;
}

}

0 个答案:

没有答案