格里高利到Hijri(伊斯兰教)约会

时间:2013-06-29 06:03:51

标签: android date time android-calendar

Android中是否有任何方式或库可以将公历日期转换为Hijri(伊斯兰)日期?我发现了一些Java库,例如Joda Time,但我需要一些适用于Android的东西。

2 个答案:

答案 0 :(得分:3)

我发现了这个,但我还没有测试它

public class DateHijri {

    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;
    }
}

答案 1 :(得分:2)

您可以在项目中使用此类(希望它有帮助):

import java.text.SimpleDateFormat;
import java.util.Date;

public class PersianDate {
    public String todayShamsi() 
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String curentDateandTime = sdf.format(new Date());
        String year = curentDateandTime.substring(0, 4);
        String month = curentDateandTime.substring(4, 6);
        String day = curentDateandTime.substring(6, 8);
        int Y = Integer.valueOf(year);
        int M = Integer.valueOf(month);
        int D = Integer.valueOf(day);
        return Shamsi(Y, M, D);
    }
    public static String Shamsi(int Y, int M, int D)
    {
        if (Y == 0)
            Y = 2000;
        if (Y < 100)
            Y = Y + 1900;
        if (Y == 2000)
        {
            if (M > 2)
            {
                SimpleDateFormat temp = new SimpleDateFormat("yyyyMMdd");
                String curentDateandTime = temp.format(new Date());
                String year = curentDateandTime.substring(0, 4);
                String month = curentDateandTime.substring(4, 6);
                String day = curentDateandTime.substring(6, 8);
                Y = Integer.valueOf(year);
                M = Integer.valueOf(month);
                D = Integer.valueOf(day);
            }
        }
        if (M < 3 || (M == 3 && D < 21))
        {
            Y -= 622;
        }
        else Y -= 621;
        switch (M)
        {
        case 1: if (D < 21)
        {
            M = 10;
            D = D + 10;
        }
        else
        {
            M = 11;
            D -= 20;
        }
        break;
        case 2: if (D < 20)
        {
            M = 11;
            D = D + 11;
        }
        else
        {
            M = 12;
            D -= 19;
        }
        break;
        case 3:
            if (D < 21)
            {
                M = 12;
                D = D + 9;
            }
            else
            {
                M = 1;
                D -= 20;
            }
            break;
        case 4:
            if (D < 21)
            {
                M = 1;
                D = D + 11;
            }
            else
            {
                M = 2; D = D - 20;
            }
            break;
        case 5:
            if (D < 22)
            {
                M = M - 3;
                D = D + 10;
            }
            else
            {
                M = M - 2;
                D = D - 21;
            }
            break;
        case 6:
            if (D < 22)
            {
                M = M - 3;
                D = D + 10;
            }
            else
            {
                M = M - 2;
                D = D - 21;
            }
            break;
        case 7:
            if (D < 23)
            {
                M = M - 3;
                D = D + 9;
            }
            else
            {
                M = M - 2;
                D = D - 22;
            }
            break;
        case 8:
            if (D < 23)
            {
                M = M - 3;
                D = D + 9;
            }
            else
            {
                M = M - 2;
                D = D - 22;
            }
            break;
        case 9:
            if (D < 23)
            {
                M = M - 3;
                D = D + 9;
            }
            else
            {
                M = M - 2;
                D = D - 22;
            }
            break;
        case 10:
            if (D < 23)
            {
                M = 7;
                D = D + 8;
            }
            else
            {
                M = 8;
                D = D - 22;
            }
            break;
        case 11:
            if (D < 22)
            {
                M = M - 3;
                D = D + 9;
            }
            else
            {
                M = M - 2;
                D = D - 21;
            }
            break;
        case 12:
            if (D < 22)
            {
                M = M - 3;
                D = D + 9;
            }
            else
            {
                M = M - 2;
                D = D - 21;
            }
            break;
        }
        String month = "00";
        String day = "00";
        //D = Integer.valueOf(D)+1;
        if (M < 10)
        {
            month = "0" + M;
        }
        else
        {
            month = String.valueOf(M);
        }
        if (D < 10)
        {
            day = "0" + D;
        }
        else
        {
            day = String.valueOf(D);
        }
        return String.valueOf(Y) + "/" + month + "/" + day;
    }
}