Java 将公历日期转换为hijri日期

Java 将公历日期转换为hijri日期,java,date,gregorian-calendar,date-conversion,hijri,Java,Date,Gregorian Calendar,Date Conversion,Hijri,我想将格里高利日期转换为伊斯兰日期,我需要一个java类来进行转换。我想给它一个“yyyy/mm/dd”格式的公历日期作为字符串,它给我相同格式的Hijri日期。有人能帮我吗?只需使用从给定链接复制的Google即可: import java.util.Calendar; /** * Gregorian-Hijri Dates Converter * * * This Code is used to convert Gregorian dates to Hijri Dat

我想将格里高利日期转换为伊斯兰日期,我需要一个java类来进行转换。我想给它一个“yyyy/mm/dd”格式的公历日期作为字符串,它给我相同格式的Hijri日期。有人能帮我吗?

只需使用从给定链接复制的Google即可:

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

public class 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;  
}  
}  
import java.util.Calendar;
/** 
*格里高利希吉里日期转换器
*  
*  
*此代码用于将公历日期转换为Hijri日期
*  
* 
*/  
公共类DateHigri{
静态双gmod(双n,双m){
返回((n%m)+m)%m;
}  
静态双[]科威特伦达(布尔调整){
Calendar today=Calendar.getInstance();
int adj=0;
如果(调整){
adj=0;
}否则{
adj=1;
}  
如果(调整){
整数调整米利=1000*60*60*24*adj;
long todaymili=today.getTimeInMillis()+adjustmili;
今天,setTimeInMillis(todaymili);
}  
double day=today.get(Calendar.day\u OF_MONTH);
双月=今天.get(日历.month);
双年=今天。获取(日历。年);
双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=1948084;
双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+28.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(){
字符串[]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;
双[]iDate=科威特克伦达(日试验);
字符串outputIslamicDate=wdNames[(int)iDate[4]+”,“+iDate[5]+”
+iMonthNames[(int)iDate[6]]+“”+iDate[7]+“AH”;
返回输出日期;
}  
}  

首先,将转换部分与格式化/解析部分分开。稍后您可以很容易地处理这些问题——关于堆栈溢出,有很多问题

就我个人而言,我会使用,这通常会使生活简单得多。例如:

import org.joda.time.Chronology;
import org.joda.time.LocalDate;
import org.joda.time.chrono.IslamicChronology;
import org.joda.time.chrono.ISOChronology;

public class Test {
    public static void main(String[] args) throws Exception {
        Chronology iso = ISOChronology.getInstanceUTC();
        Chronology hijri = IslamicChronology.getInstanceUTC();

        LocalDate todayIso = new LocalDate(2013, 3, 31, iso);
        LocalDate todayHijri = new LocalDate(todayIso.toDateTimeAtStartOfDay(),
                                             hijri);
        System.out.println(todayHijri); // 1434-05-19
    }
} 
(感觉应该有一种更干净的方法在年表之间转换日期,但我无法立即找到。)

现在有了Hejrah Date,Java 8就足够了 片段: 试试哪个实现
java.util.Calendar

使用此日历,您可以将《古兰经》转换为《格里高利历》,反之亦然,
您还可以使用
java.text.simpleDataFormat
格式化日期。

在android平台导入上转换日期的示例方法

import org.joda.time.Chronology;
import org.joda.time.DateTime;
import org.joda.time.chrono.ISOChronology;
import org.joda.time.chrono.IslamicChronology;
import org.joda.time.LocalDate;
然后

关于onDateSet方法

@Override
public void onDateSet(HijriDatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {




    Chronology iso = ISOChronology.getInstanceUTC();
    Chronology hijri = IslamicChronology.getInstanceUTC();

    DateTime dtHijri = new DateTime(year,monthOfYear,monthOfYear,dayOfMonth,dayOfMonth,hijri);

    DateTime dtIso = new DateTime(dtHijri, iso);


    Log.i("converted date" ,String.valueOf(dtIso));
}

你试过什么吗?你有没有遇到过什么特别的问题?我尝试了一些通过搜索找到的代码,但其中没有一个可能不起作用。我想我宁愿使用现有的库,也不要将所有这些代码都包含在我自己的项目中:)它不起作用。它会带来一些类似的日期。例如,我更改了它的输入以获取字符串,并将“2014/1/29”和“2014/2/1”的日期设置为相同的日期。但是,我更喜欢使用库而不是所有这些代码。谢谢你的帮助;)这不是科威特日历。这是一个伊斯兰克兰达尔。@Abdennour TOUMI这也是阿拉伯语日历,检查它完全基于Java-8日期时间API。+1我更喜欢你的方式,代码简短。在我发布的这篇文章中,我只知道它是如何工作的+knowbody我不知道为什么,但这段代码带给我的是1434-05-18,而不是1434-05-19?我该如何解决这个问题?@anony:这里有两种不同的可能性——一种是你预期的年代错误(有天文和民用的年代),另一种是你需要使用一种不同闰年模式的伊斯兰年表。有关详细信息,请参阅伊斯兰年表的文档。@anony Chromeory hijri=IslamicChromeory.getInstance(沙特阿拉伯,伊斯兰年表.LEAP_YEAR_15_为基础)。getInstanceUTC()@韦德普拉卡什:伊斯兰历法有多种变体,有不同的闰年模式等。你需要准确地找出哪种历法
implements  HijriDatePickerDialog.OnDateSetListener
@Override
public void onDateSet(HijriDatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {




    Chronology iso = ISOChronology.getInstanceUTC();
    Chronology hijri = IslamicChronology.getInstanceUTC();

    DateTime dtHijri = new DateTime(year,monthOfYear,monthOfYear,dayOfMonth,dayOfMonth,hijri);

    DateTime dtIso = new DateTime(dtHijri, iso);


    Log.i("converted date" ,String.valueOf(dtIso));
}