Java 从格里高利到希吉里的日期

Java 从格里高利到希吉里的日期,java,android,Java,Android,我使用以下代码将公历日期转换为Hijri: import java.util.Calendar; /** * Gregorian-Hijri Dates Converter * * * This Code is used to convert Gregorian dates to Hijri Dates * * */ public class Hijri {

我使用以下代码将公历日期转换为Hijri:

   import java.util.Calendar;  
    /** 
     * Gregorian-Hijri Dates Converter 
     *  
     *  
     * This Code is used to convert Gregorian dates to Hijri Dates  
     *  
     * 
     */  

    public class Hijri {  

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

        static double[] kuwaiticalendar(boolean adjust, int Y, int M, int D) {  
            Calendar theDate = Calendar.getInstance();  
            theDate.set(Y, M, D);
            int adj=0;  
            if(adjust){  
                adj=0;  
            }else{  
                adj=1;  
            }  

            if (adjust) {  
                int adjustmili = 1000 * 60 * 60 * 24 * adj;  
                long thedatemili = theDate.getTimeInMillis() + adjustmili;  
                theDate.setTimeInMillis(thedatemili);  
            }  
            double day = theDate.get(Calendar.DAY_OF_MONTH);  
            double  month = theDate.get(Calendar.MONTH);  
            double  year = theDate.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 = 1948086;
            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 + 29.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(int Y, int M, int D) {  
            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, Y, M, D);  
            String outputIslamicDate = (int) iDate[7] + "-" + (int) iDate[6] + "-" + (int) iDate[5];  

            return outputIslamicDate;  
        }  

    }
import java.util.Calendar;
/** 
*格里高利希吉里日期转换器
*  
*  
*此代码用于将公历日期转换为Hijri日期
*  
* 
*/  
公共类Hijri{
静态双gmod(双n,双m){
返回((n%m)+m)%m;
}  
静态双[]科威特伦达(布尔调整,int Y,int M,int D){
日历日期=Calendar.getInstance();
日期集(Y,M,D);
int adj=0;
如果(调整){
adj=0;
}否则{
adj=1;
}  
如果(调整){
整数调整米利=1000*60*60*24*adj;
long thedatemili=日期。getTimeInMillis()+调整mili;
日期。设置时间单位为毫秒(日期单位为毫秒);
}  
double day=日期get(日历,每月的第天);
双月=日期。获取(日历。月);
双年=日期。获取(日历。年);
双m=月+1;
双y=年;
如果(m<3){
y-=1;
m+=12;
}  
双a=数学楼层(y/100);
双b=2-a+数学楼层(a/4.);
如果(y<1583)
b=0;
如果(y==1582){
如果(m>10)
b=-10;
如果(m==10){
b=0;
如果(第4天以上)
b=-10;
}  
}  
双jd=数学层(365.25*(y+4716))+数学层(30.6001*(m+1))+天
+b-1524;
b=0;
如果(jd>2299160){
a=数学楼层((jd-1867216.25)/36524.25);
b=1+a——数学楼层(a/4);
}  
双bb=jd+b+1524;
双cc=数学楼层((bb-122.1)/365.25);
双dd=数学楼层(365.25*cc);
双ee=数学楼层((bb-dd)/30.6001);
日=(bb-dd)-数学层(30.6001*ee);
月=ee-1;
如果(ee>13){
cc+=1;
月份=ee-13;
}  
年份=cc-4716;
双wd=gmod(jd+1,7)+1;
双iyear=10631./30。;
双epochastro=1948086;
双epochcivil=1948085;
双移位1=8.01/60。;
双z=jd-epochastro;
双cyc=数学楼层(z/10631);
z=z-10631*cyc;
双j=数学楼层((z-移位1)/iyear);
双iy=30*cyc+j;
z=z-数学楼层(j*iyear+shift1);
双im=数学楼层((z+29.5001)/29.5);
如果(im==13)
im=12;
双id=z-数学楼层(29.5001*im-29);
double[]myRes=新的double[8];
myRes[0]=天;//计算日(CE)
myRes[1]=月份-1;//计算月份(CE)
myRes[2]=年;//计算年(CE)
myRes[3]=jd-1;//朱利安日数
myRes[4]=wd-1;//工作日编号
myRes[5]=id;//伊斯兰日期
myRes[6]=im-1;//伊斯兰月
迈尔斯[7]=iy;//伊斯兰年
返回myRes;
}  
静态字符串writeIslamicDate(inty,intm,intd){
字符串[]wdNames={“Ahad”、“Ithnin”、“Thulatha”、“Arbaa”、“Khams”,
“Jumuah”、“Sabt”};
字符串[]iMonthNames={“Muharram”、“Safar”、“Rabi'ul Awwal”,
“Rabi'ul Akhir”、“Jumadal Ula”、“Jumadal Akhira”、“Rajab”,
“沙班”、“斋月”、“肖瓦尔”、“杜尔卡阿达”、“杜尔希贾”};
//该值用于给出正确的天数+-1天
布尔dayTest=true;
double[]iDate=科威特克伦(dayTest,Y,M,D);
字符串outputIslamicDate=(int)iDate[7]+“-”+(int)iDate[6]+“-”+(int)iDate[5];
返回输出日期;
}  
}
当我设置这个日期2014/7/27时,它返回1435/10/0
我该怎么办?

它该怎么办?(对不起,我不明白Hijri日历)它应该返回1435/9/30好的,那么1435是Hijri年,对吗?9月和9月的公历相同吗?月30号是30号吗?我知道
日历
课程从0开始(1月份),这可能解释了为什么会比你预期的多一个。代码有点问题,我不知道那是什么(我没有写代码!)好的,我不确定我能马上帮上忙,但我已经阅读了Hijri,并理解2014/7/27应该是1435/9/29或1435/9/30(取决于我在此日历转换器站点中输入的时间是在中午之前还是之后…。我将稍后再次尝试查看此问题-您的结果似乎已将月份增加到10,但也将月份的日期设置为0,这在任何日历中都不应发生。