PDA

View Full Version : اشکال کد اکیلیپس تبدیل میلادی به قمری(sos)



alim2006
شنبه 04 خرداد 1392, 16:29 عصر
سلام به همه اساتید برنامه نویسی
این کد برای تبدیل تاریخ میلادی به قمری هست
کار میکنه ولی به این صورت
سال را درست تبدیل می کند
ماه را درست تبدیل می کند
روز را ۲ روز جلو نشان می دهد
کسی می تواند این مشکل را حل کند
با دنیا دنیا تشکر
ایتم کدشه :



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

Modernidea
یک شنبه 05 خرداد 1392, 02:11 صبح
سلام

1- لطفا کد را در تگ کد(جاوا یا هر تگی که مربوط به کد باشد) قرار بدید
2- اگر منبع این کد را دارید، لطفا ذکر کنید
3- چک کنید ببنید دستگاه یا مجازی سازی که برنامه را روی آن اجرا میکنید تاریخ آن تنظیم است یا نه. چون این کد و یا هر کد دیگری، تاریخ را بر حسب زمان سیستم بر میگرداند مگر اینکه مستقیم از سرور خاصی بگیرد که در این مورد به این شکل عمل نمیکند و بر اساس زمان فعلی سیستم، محاسباتی انجام داده و تاریخ مورد نظر را بر میگرداند.

موفق باشید.

alim2006
یک شنبه 05 خرداد 1392, 07:16 صبح
ازکد های این این لینک استفاده کردم
http://www.coderanch.com/t/534271/java/java/Gregorian-Hijri-Dates-Converter-JAVA