Java 从格里高利到希吉里的日期
我使用以下代码将公历日期转换为Hijri: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 {
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,这在任何日历中都不应发生。